![](/img/trans.png)
[英]Regex to capture numbers up to 2 digits and coma if followed by another word and number
[英]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,}
你有结果等待...
您会得到BUFFING
和MACHINE
的匹配项,因为模式(?=.*\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.