我有以下类型的字符串:
1432_ott_457_blusp
312_fooob_bork_1234
broz_901_6453
kkhas_1781_LET_GROK_234
1781_234_kkhas
等等。换句话说,每个字符串包含多个由
_
分隔的子字符串。子串的总数是可变的。我查找一个包含 4 位数字的子字符串,另一个包含 3 位数字的子字符串。正如您所看到的,两个子字符串可以位于字符串内的任何位置。解决方案如
import re
three_digits = re.findall('\d{3}')
不起作用,因为它将匹配 3 位数字的子字符串和 4 位数字的前 3 位数字。假设 3 位和 4 位子字符串都存在的解决方案很好,但检查此前提条件的解决方案会更好。
如果您想坚持使用正则表达式,那么您就快完成了:
import re
input = """1432_ott_457_blusp
312_fooob_bork_1234
broz_901_6453
kkhas_1781_LET_GROK_234
1781_234_kkhas"""
for s in input.splitlines():
print(re.findall(r'\d{3,4}', s))
注意:这不会利用下划线分隔符规则,因此如果您输入类似
123abc_000_1111
的内容,它也会在 123
上触发。
我分别做了3个连续数字和4个连续数字,这些可以合并为一个
def find_substrings(s):
three_digits = re.findall(r'(?<!\d)\d{3}(?!\d)', s)
four_digits = re.findall(r'(?<!\d)\d{4}(?!\d)', s)
return three_digits, four_digits
输出:
[('1432_ott_457_blusp', ['457'], ['1432']),
('312_fooob_bork_1234', ['312'], ['1234']),
('broz_901_6453', ['901'], ['6453']),
('kkhas_1781_LET_GROK_234', ['234'], ['1781']),
('1781_234_kkhas', ['234'], ['1781'])]
在一份声明中检查
def find_substrings(s):
combined = re.findall(r'(?<!\d)(\d{3}|\d{4})(?!\d)', s)
return combined
这里检查开头是否没有数字,结尾是否没有数字。以确保结果一致。