我正在尝试解析文本,以计算出有多少 字母数字字母 序列。
考虑以下字符串:a123123aas52342ooo345345ooo
我使用了以下正则表达式:
re.findall(r"[a-zA-Z]+\d+[a-zA-Z]+", string)
应检测到的序列为:
a123123aas
aas52342ooo
ooo345345ooo
但是,这就是我得到的:
a123123aas
ooo345345ooo
我在做什么错?我觉得正则表达式可能不是此问题的解决方案。有什么建议吗?
答案 0 :(得分:0)
这个简单的表达式或对它的修改后的版本可能会在我们的输入字符串中起作用:
[a-zA-Z]+\d+[a-zA-Z]+$|[a-zA-Z]+\d+
import re
regex = r"[a-zA-Z]+\d+[a-zA-Z]+$|[a-zA-Z]+\d+"
test_str = "a123123aas52342ooo345345ooo"
print(re.findall(regex, test_str))
['a123123', 'aas52342', 'ooo345345ooo']
re.finditer
import re
regex = r"[a-zA-Z]+\d+[a-zA-Z]+$|[a-zA-Z]+\d+"
test_str = "a123123aas52342ooo345345ooo"
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
for groupNum in range(0, len(match.groups())):
groupNum = groupNum + 1
print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))
在this demo的右上角对表达式进行了说明,如果您想探索/简化/修改它,在this link中,您可以观察它如何与某些示例输入步骤匹配一步一步,如果您喜欢。
jex.im可视化正则表达式:
答案 1 :(得分:0)
“所有重叠匹配”答案的一些解决方法:
>>> import re
>>> s = "a123123aas52342ooo345345ooo"
>>> print(re.findall("(?<![a-zA-Z])(?=([a-zA-Z]+\d+[a-zA-Z]+))", s))
['a123123aas', 'aas52342ooo', 'ooo345345ooo']
这基本上是说:
示例字符串上的demo。