为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

凤凰求蛊 2021-12-21 10:44:45
我有来自较早问题的以下 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.显然,当正则表达式遇到负前瞻时,它会退后一步,看看它是否可以匹配。可以这么说,我怎样才能使消极的环顾变得更贪婪或更具有破坏性?
查看完整描述

2 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

您可以使用

(?<!\S)(?!\*+\d)[a-zA-Z]*\*[a-zA-Z*]*

请参阅正则表达式演示

细节

  • (?<!\S) - 字符串或空格的开头

  • (?!\*+\d) - 如果在 1 个或多个星号后有数字,则匹配失败

  • [a-zA-Z]* - 0+ 个字母

  • \* - 星号

  • [a-zA-Z*]* - 0+ 个字母或星号。

重点是在字符串的开头或空格之后开始匹配,检查1个或多个星号后是否没有数字,然后匹配您需要的模式。

请参阅Python 演示

import re

text = '''

    (A) Match these:

    *** star* st**r


    (B) Not these:

    800*m *4,500 


    (C) And not these:

    800**m **4,000

    '''

print(re.findall(r'(?<!\S)(?!\*+\d)[a-zA-Z]*\*[a-zA-Z*]*', text))

# => ['***', 'star*', 'st**r']


查看完整回答
反对 回复 2021-12-21
?
SMILET

TA贡献1796条经验 获得超4个赞

这个对我自己问题的回答的灵感来自 Wiktor Stribiżew 的评论。它似乎工作。我把它张贴在这里,以便更敏锐的眼光可以告诉我它的任何缺陷。


regex_pat = re.compile('''

            (?<!\S)

            [a-zA-Z*]*            

            \*

            [a-zA-Z*]*

            (?!\S)

          ''', re.VERBOSE) 

我理解的逻辑是前瞻和后视强制任何匹配成为一个完整的“单词”,从那里开始,您将不必再担心匹配中的数字,因为它们不是定义字符的一部分无论如何设置要匹配。


查看完整回答
反对 回复 2021-12-21
  • 2 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信