在字符串中查找4个连续数字的子串和3个连续数字的子串

问题描述 投票:0回答:2

我有以下类型的字符串:

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 位子字符串都存在的解决方案很好,但检查此前提条件的解决方案会更好。

python string substring
2个回答
1
投票

如果您想坚持使用正则表达式,那么您就快完成了:

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
上触发。


0
投票

我分别做了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

这里检查开头是否没有数字,结尾是否没有数字。以确保结果一致。

© www.soinside.com 2019 - 2024. All rights reserved.