未检测到字母数字字母序列

时间:2019-07-12 19:48:39

标签: regex python-3.x

我正在尝试解析文本,以计算出有多少 字母数字字母 序列。

考虑以下字符串:a123123aas52342ooo345345ooo

我使用了以下正则表达式:

re.findall(r"[a-zA-Z]+\d+[a-zA-Z]+", string)

应检测到的序列为:

  • a123123aas
  • aas52342ooo
  • ooo345345ooo

但是,这就是我得到的:

  • a123123aas
  • ooo345345ooo

我在做什么错?我觉得正则表达式可能不是此问题的解决方案。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

这个简单的表达式或对它的修改后的版本可能会在我们的输入字符串中起作用:

[a-zA-Z]+\d+[a-zA-Z]+$|[a-zA-Z]+\d+

使用re.findall进行测试

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中,您可以观察它如何与某些示例输入步骤匹配一步一步,如果您喜欢。

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 1 :(得分:0)

“所有重叠匹配”答案的一些解决方法:

>>> import re
>>> s = "a123123aas52342ooo345345ooo"
>>> print(re.findall("(?<![a-zA-Z])(?=([a-zA-Z]+\d+[a-zA-Z]+))", s))
['a123123aas', 'aas52342ooo', 'ooo345345ooo']

这基本上是说:

  • 向前看,确保存在所需的模式并将其保存
  • 后面添加的后缀确保它是每个字母序列的第一个字母。

示例字符串上的demo