我试图找到数字,而不是某些单词的后继。我使用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']
答案 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']
详细信息
\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']