正则表达式捕获其中至少有一个数字的单词
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,}
您已等待结果...
你得到 BUFFING
和 MACHINE
的匹配,因为模式 (?=.*\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。
我几乎完成了我所有的正则表达式,但我遇到了另一个问题,我有这个正则表达式:
(?=.*\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,}
您已等待结果...
你得到 BUFFING
和 MACHINE
的匹配,因为模式 (?=.*\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。