正则表达式捕获其中至少有一个数字的单词

Regex to capture word with at least one number in it

我几乎完成了我所有的正则表达式,但我遇到了另一个问题,我有这个正则表达式:

(?=.*\d)[A-Z0-9]{5,}

它捕获了我需要的所有东西:

AP51711

它有效,但有时它有一个奇怪的行为,据我对正则表达式的理解(我是菜鸟:p)我的正则表达式应该捕获至少包含一个数字的东西!

但是在这个字符串上:

3M BUFFING MACHINE P64392

输出将是:

['BUFFING', 'MACHINE', 'P64392']

我不明白为什么 'BUFFING' 和 'MACHINE' 被捕获:O

如果有人能帮助我理解这一点,谢谢!

试试这个:

(?<=^|)(?=[^ ]*\d)[^ ]+

代码:

pattern = r'(?<=^|)(?=[^ ]*\d)[^ ]+' 
text = "3M BUFFING MACHINE P64392"
result = re.findall(pattern, text)
print(result)

这里你真的不需要正则表达式

sentence = "3M BUFFING MACHINE P64392"

words_with_digits = [word 
                     for word in sentence.split()
                     if any(char.isdigit() for char in word)]
print(words_with_digits)

这将产生

['3M', 'P64392']

如果你这样做:

 (?=[A-Z]*\d)[A-Z0-9]{5,}

您已等待结果...

你得到 BUFFINGMACHINE 的匹配,因为模式 (?=.*\d)[A-Z0-9]{5,} 断言从当前位置开始,该行右侧的某处应该有一个数字。

如果该断言为真,则匹配 A-Z 和 0-9 范围内的任何字符 5 次或更多次。

您还可以做的是从单词边界开始,以防止出现部分单词匹配,这样在扫描匹配项时就不会在每个位置都触发前瞻。

然后从接受的字符中断言 5 个字符,如果该断言为真,则至少匹配一个数字。

不混合 \d[0-9]:

\b(?=[A-Z\d]{5})[A-Z]*\d[A-Z\d]*

看到一个regex demo