猿问

正则表达式:使负面环视“更贪婪”

我有来自较早问题的以下 Python 正则表达式模式:


regex_pat = re.compile('''

            (

            [a-zA-Z\*]*

            \*

            [a-zA-Z\*]*

            )+           

          ''', re.VERBOSE) 

现在,如果任何数字与“单词”混合在一起,尤其是在开头或结尾,我希望匹配失败。


text = '''

    (A) Match these:

    *** star* st**r


    (B) Not these:

    800*m *4,500 


    (C) And not these:

    800**m **4,000

    '''

通过在各个地方尝试一对否定前瞻和否定后视,我可以摆脱 (B) 匹配,但不能摆脱 (C) 匹配。例如:


regex_pat = re.compile('''

            (

            [a-zA-Z\*]*

            (?<!\d)

            \*

            (?!\d)

            [a-zA-Z\*]*

            )+           

          ''', re.VERBOSE) 

regex_pat.findall(text)

# ['***', 'star*', 'st*r', '**m', '**'] The last two matches are no good.

显然,当正则表达式遇到负前瞻时,它会退后一步,看看它是否可以匹配。可以这么说,我怎样才能使消极的环顾变得更贪婪或更具有破坏性?


凤凰求蛊
浏览 226回答 2
2回答

RISEBY

您可以使用(?<!\S)(?!\*+\d)[a-zA-Z]*\*[a-zA-Z*]*请参阅正则表达式演示。细节(?<!\S)&nbsp;- 字符串或空格的开头(?!\*+\d)&nbsp;- 如果在 1 个或多个星号后有数字,则匹配失败[a-zA-Z]*&nbsp;- 0+ 个字母\*&nbsp;- 星号[a-zA-Z*]*&nbsp;- 0+ 个字母或星号。重点是在字符串的开头或空格之后开始匹配,检查1个或多个星号后是否没有数字,然后匹配您需要的模式。请参阅Python 演示:import retext = '''&nbsp; &nbsp; (A) Match these:&nbsp; &nbsp; *** star* st**r&nbsp; &nbsp; (B) Not these:&nbsp; &nbsp; 800*m *4,500&nbsp;&nbsp; &nbsp; (C) And not these:&nbsp; &nbsp; 800**m **4,000&nbsp; &nbsp; '''print(re.findall(r'(?<!\S)(?!\*+\d)[a-zA-Z]*\*[a-zA-Z*]*', text))# => ['***', 'star*', 'st**r']

SMILET

这个对我自己问题的回答的灵感来自 Wiktor Stribiżew 的评论。它似乎工作。我把它张贴在这里,以便更敏锐的眼光可以告诉我它的任何缺陷。regex_pat = re.compile('''&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (?<!\S)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [a-zA-Z*]*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [a-zA-Z*]*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (?!\S)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ''', re.VERBOSE)&nbsp;我理解的逻辑是前瞻和后视强制任何匹配成为一个完整的“单词”,从那里开始,您将不必再担心匹配中的数字,因为它们不是定义字符的一部分无论如何设置要匹配。
随时随地看视频慕课网APP

相关分类

Python
我要回答