regex 基于不同模式拆分文本的正则表达式(在单个表达式中)

velaa5lx  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(135)

我有一些模式,可以检测问题和分歧。我使用了一些假设,比如:
1.每个模式都以\n开头
1.每个模式都以\s+结尾
我定义的模式是:

<NUM>.
Q <NUM>.
Q <NUM>
<Q.NUM.>
<NUM>
Question <NUM>
<Example>
Problem <NUM>
Problem:
<Alphabet><Number>.
<EXAMPLE>
Example <NUM>

Someone suggested the below regex: try the demo

((Q|Question|Problem:?|Example|EXAMPLE)\.? ?\d+\.? ?|(Question|Problem:?|Example|EXAMPLE) ?)

但它捕获了中间的模式,这对我来说是个问题,因为字符串中间也可以有Q.Example. 2,但没有捕获<NUM>.
这个列表是基于优先级的,所以我能想到的是构建这些表达式,并基于优先级运行一个循环,例如:

QUESTIONS = [
    re.compile("\n\d+\."),
    re.compile("\nQ.\s*\d+\."), 
    re.compile("\nExample.\s*\d+\.")
]

但是效率很低,我怎么能把这些都用在一个表达式中呢?

以下是测试字符串

'TEStlabZ\nEDULABZ\nINTERNATIONAL\nLOGARITHMS AND INDICES\n\nQ.1. (A) Convert each of the following to logarithmic form.\n(i) \\( 5^{2}=25 \\)\n(ii) \\( 3^{-3}=\\frac{1}{27} \\)\n(iii) \\( (64)^{\\frac{1}{3}}=4 \\)\n(iv) \\( 6^{0}=1 \\)\n(v) \\( 10^{-2}=0.01 \\) (vi) \\( 4^{-1}=\\frac{1}{4} \\)\nAns. We know that \\( a^{b}=x \\Rightarrow b=\\log _{a} x \\)\n(i) \\( 5^{2}=25 \\quad \\therefore \\log _{5} 25=2 \\)\n(ii) \\( 3^{-3}=\\frac{1}{27} \\therefore \\log _{3}\\left(\\frac{1}{27}\\right)=-3 \\)\n(iii) \\( (64)^{\\frac{1}{3}}=4 \\therefore \\log _{64} 4=\\frac{1}{3} \\)\n(iv) \\( 6^{0}=1 \\quad \\therefore \\log _{6} 1=0 \\)\n(v) \\( 10^{-2}=0.01 \\therefore \\log _{10}(0.01)=-2 \\)\n(vi) \\( 4^{-1}=\\frac{1}{4} \\therefore \\log _{4}\\left(\\frac{1}{4}\\right)=-1 \\)\nQ.1. (B) Convert each of the following to exponential form.\n(i) \\( \\log _{3} 81=4 \\)\n(ii) \\( \\log _{8} 4=\\frac{2}{3} \\)\n(iii) \\( \\log _{2} \\frac{1}{8}=-3 \\)\n(iv) \\( \\log _{10}(0.01)=-2 \\)\n(v) \\( \\log _{5}\\left(\\frac{1}{5}\\right)=-1 \\) (vi) \\( \\log _{a} 1=0 \\)\nAns.\n(i) \\( \\log _{3} 81=4 \\quad \\therefore 3^{4}=81 \\)\n(ii) \\( \\log _{8} 4=\\frac{2}{3} \\quad \\therefore 8^{\\frac{2}{3}}=4 \\)\n(iii) \\( \\log _{2} \\frac{1}{8}=-3 \\quad \\therefore \\quad 2^{-3}=\\frac{1}{8} \\)\n(iv) \\( \\log _{10}(0.01)=-2 \\quad \\therefore \\quad 10^{-2}=0.01 \\)\n(v) \\( \\log _{5}\\left(\\frac{1}{5}\\right)=-1 \\quad \\therefore \\quad 5^{-1}=\\frac{1}{5} \\)\n(vi) \\( \\log _{a} 1=0 \\)\n\\( \\therefore a^{0}=1 \\)\nMath Class IX\n1\nQuestion Bank'
t9aqgxwy

t9aqgxwy1#

无羞于刚做哑巴解:
^(\d+\.|Q \d+\.|Q \d+|Q\.\d+\.|\d+|Question \d+|Example( \d+)?|Problem \d+|Problem:|[A-Z]\d\.|EXAMPLE)\s+

yk9xbfzb

yk9xbfzb2#

您可以使用

(?m)^(?!$)(?:((?i:Question|Problem:?|Example)|[A-Z])[. ]?)?(\d+[. ]?)?(?=\s)

请参阅regex demo

  • 详细数据 *:
  • (?m)^-行的开始(m允许^匹配任何行开始位置)
  • (?!$)-同一位置不允许行结束(即不允许空行匹配)
  • (?:((?i:Question|Problem:?|Example)|[A-Z])[. ]?)?-可选序列
  • ((?i:Question|Problem:?|Example)|[A-Z])-组1:不区分大小写的QuestionProblemProblem:Example,或者大写字母
  • [. ]?-一个空格或.
  • (\d+[. ]?)?-ID为2的可选捕获组,匹配一个或多个数字,然后是可选的.或空格
  • (?=\s)-正lookahead,需要在当前位置的右侧立即添加一个空白字符。

相关问题