繁体   English   中英

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

[英]Regex to capture word with at least one number in it

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

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

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

AP51711

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

但是在这个字符串上:

3M BUFFING MACHINE P64392

output 将是:

['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,}断言从当前的 position 开始,该行的右侧应该有一个数字。

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

您还可以从字边界开始以防止部分字匹配,以便在扫描匹配时不会在每个 position 上触发前瞻。

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

不混合\d[0-9]

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

查看正则表达式演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM