带有可选空格的正则表达式否定环顾

时间:2019-08-13 09:06:47

标签: regex python-3.x regex-lookarounds

我试图找到数字,而不是某些单词的后继。我使用Python3中的正则表达式执行此操作。我的猜测是必须使用否定的环顾四周,但是由于可选的空格,我很挣扎。请参见以下示例:

'200 word1 some 50 foo and 5foo 30word2'

请注意,实际上单词1和单词2可以用很多不同的单词代替,这使得在这些单词上寻找正匹配变得更加困难。因此,排除foo后面的数字会更容易。预期结果是:

[200, 30]

我的尝试:

s = '200 foo some 50 bar and 5bar 30foo
pattern = r"[0-9]+\s?(?!foo)"
re.findall(pattern, s)

结果

['200', '50 ', '5', '3']

2 个答案:

答案 0 :(得分:3)

您可以使用

import re
s = '200 word1 some 50 foo and 5foo 30word2'
pattern = r"\b[0-9]+(?!\s*foo|[0-9])"
print(re.findall(pattern, s))
# => ['200', '30']

请参见Python demoregex graph

enter image description here

详细信息

  • \b-单词边界
  • [0-9]+-仅1个以上ASCII数字
  • (?!\s*foo|[0-9])-没有立即跟上
    • \s*foo-0 +空格和foo字符串
    • |-或
    • [0-9]-ASCII数字。

答案 1 :(得分:2)

您应该使用模式\b[0-9]+(?!\s*foo\b)(?=\D),该模式表示查找所有数字,这些数字后面没有可选的空格和单词foo

s = '200 word1 some 50 foo and 5foo 30word2'
matches = re.findall(r'\b[0-9]+(?!\s*foo\b)(?=\D)', s)
print(matches)

此打印:

['200', '30']