python正则表达式单独的赋值语句以分号结尾

2024-06-28 15:45:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由许多赋值语句组成的字符串,如下所示。我想把它们分开。所以我想出了regexre.findall(r's\d+\.([^=]+)=([^;]+);', string)

s9.allowUpload=null;s9.analyse=null;s9.description=null;s9.fillblankType=null;s9.gmtCreate=1551272584901;s9.gmtModified=1577668049380;

它就像

[('allowUpload', 'null'), ('analyse', 'null'), ('description', 'null'), ('fillblankType', 'null'), ('gmtCreate', '1551272584901'), ('gmtModified', '1577668049380')]

一切都很顺利,直到我遇到一个值,该值也包含分号,如下面的s9.optionsDetail

s9.type=-1;s9.optionDtos=s42;s9.optionsDetail="[{\"content\":\"<p><span style=\\\"font-size:16px;font-family: \'Calibri\',sans-serif;\\\"  >j*m+i</span></p>\"}]";

Tags: 字符串description语句nullspanfont赋值analyse
2条回答

您可以使用alternation来匹配从[""]的字符,或者使用(?:"\[.*?\]"|[^;]+)匹配除;之外的任何字符

s\d+\.([^=]+)=((?:"\[.*?\]"|[^;]+));

关于交替

  • (?:非捕获组
    • "\[.*?\]"["到第一次出现"]的匹配
    • |
    • [^;]+匹配除;之外的任何字符的1+倍
  • )关闭组

Regex demo

@第四只鸟的答案使用了optionsDetail值的规则性,它不能根本解决字符串中出现的分号。以下是一个例子:

s133.plainTextTitle="\u4E49int a[5][5]; \u540E\uFF0C\u662F_________";
s133.allowUpload=null;s133.analyse=null;s133.description=null;s133.fillblankType=null;s133.gmtCreate=1551272584908;s133.gmtModified=1577668049389;s133.id=1217514489;s133.judgeDtos=null;s133.judgerules="null";s133.ojCases=null;s133.ojMemLimit=null;s133.ojNeedInput=true;s133.ojSupportedLanguage=null;s133.ojSupportedLanguageList=null;s133.ojTimeLimit=null;s133.ojTryTime=null;s133.optionDtos=s174;s133.options=null;s133.optionsDetail="[{\"id\":7679941034291,\"content\":\"<p><span style=\\\"font-size: 16px; font-family: \'Times New Roman\', serif;\\\"  >a[1][0]</span></p>\",\"answer\":true,\"analyse\":null},{\"id\":17679941034291,\"content\":\"<p><span style=\\\"font-size:16px;font-family: \'Times New Roman\',\'serif\';\\\"  >a[0][1]</span></p>\",\"answer\":false,\"analyse\":null},{\"id\":27679941034291,\"content\":\"<p><span style=\\\"font-size:16px;font-family: \'Times New Roman\',\'serif\';\\\"  >a[1][1]</span></p>\",\"answer\":false,\"analyse\":null},{\"id\":37679941034291,\"content\":\"<p><span style=\\\"font-size:16px;font-family: \'Times New Roman\',\'serif\';\\\"  >a[1][5]&nbsp;</span></p>\",\"answer\":false,\"analyse\":null}]";s133.plainTextTitle="\u5728\u5B9A\u4E49int a[5][5]; \u540E\uFF0C\u6570\u7EC4a\u4E2D\u7684\u7B2C6\u4E2A\u5143\u7D20\u662F_________";s133.position=2;s133.sampleAnswerJson="null";s133.sampleAnswers=null;s133.score=2.00;s133.stdAnswer=null;s133.testId=1220061796;s133.title="<p><span style=\"font-size:16px;font-family:\u5B8B\u4F53;\"  >\u5728\u5B9A\u4E49</span><span style=\"font-size:16px;font-family:\'Times New Roman\',\'serif\';\"  >int a[5][5];&nbsp; </span><span style=\"font-size:16px;font-family:\u5B8B\u4F53;\"  >\u540E\uFF0C\u6570\u7EC4</span><span style=\"font-size:16px;font-family:\'Times New Roman\',\'serif\';\"  >a</span><span style=\"font-size:16px;font-family:\u5B8B\u4F53;\"  >\u4E2D\u7684\u7B2C</span><span style=\"font-size:16px;font-family:\'Times New Roman\',\'serif\';\"  >6</span><span style=\"font-size:16px;font-family:\u5B8B\u4F53;\"  >\u4E2A\u5143\u7D20\u662F</span><span style=\"font-size: 16px;font-family:\'Times New Roman\',\'serif\';\"  >_________</span></p>";s133.titleAttachment="null";s133.titleAttachmentDtos=null;s133.type=1;

我想到了使用s133.分割字符串的想法,这可以通过regex (s\d+\.)获得。然后我会得到一个列表,如

['', 'allowUpload=null;', 'analyse=null;']

在丢弃第一个元素和每个元素末尾的;之后,在第一次出现=时使用split("=", 1)进行拆分就可以了

这种方法有一个明显的缺点,当s133.看起来像s133.plainTextTitle="s133.plainTextTitle"时,它会得到错误的结果。但我认为这种情况很少发生

相关问题 更多 >