python 正则表达式用一条命令代替两种情况

python regular expression replace two situations with one command

我想替换像

这样的字符串
'''1  2  3  4  5  6 abcde fghij klmno pqrst 7 8 9 10 uvwxyz abcdef 11 12 13'''

'''1  2  3  4  5  6
abcde fghij klmno pqrst
7 8 9 10
uvwxyz abcdef
11 12 13'''

这是我的方法:

s = re.sub(r'(\d) ([a-z])', r'\n', s)
s = re.sub(r'([a-z]) (\d)', r'\n', s)

如何在 one regular expression 中执行此操作?我知道我可以使用 re.findallgroups 但我想找到更简单的方法?

你可以使用 re.split

>>> s = '''1  2  3  4  5  6 abcde fghij klmno pqrst 7 8 9 10 uvwxyz abcdef 11 12 13'''
>>> for i in re.split(r'(?<=\d)\s+(?=[A-Za-z])|(?<=[A-Za-z])\s+(?=\d)', s):
        print(i)


1  2  3  4  5  6
abcde fghij klmno pqrst
7 8 9 10
uvwxyz abcdef
11 12 13
>>> print('\n'.join(re.split(r'(?<=\d)\s+(?=[A-Za-z])|(?<=[A-Za-z])\s+(?=\d)', s)))

re.sub

>>> print(re.sub(r'(?<=\d)\s+(?=[A-Za-z])|(?<=[A-Za-z])\s+(?=\d)', r'\n', s))
1  2  3  4  5  6
abcde fghij klmno pqrst
7 8 9 10
uvwxyz abcdef
11 12 13

上述re.sub命令会将数字与字母之间或字母与数字之间的一个或多个空格替换为换行符。

您可以使用正则表达式或命令:

s = re.sub(r'((\d) ([a-z])|([a-z]) (\d))', r'\n', s)

它将匹配第 2 组和第 3 组或第 4 组和第 5 组。=]

我真的认为最简单的方法是使用 findall 而不是拆分或 sub-ing:

进行匹配
result = re.findall(r"\d+(?:\s+\d+)*|[a-z]+(?:\s+[a-z]+)*", text)
print('\n'.join(result))

或一行:

result = '\n'.join(re.findall(r"\d+(?:\s+\d+)*|[a-z]+(?:\s+[a-z]+)*", text))

给出:

1  2  3  4  5  6
abcde fghij klmno pqrst
7 8 9 10
uvwxyz abcdef
11 12 13

\d+(?:\s+\d+)* 匹配带数字和空格的部分。

[a-z]+(?:\s+[a-z]+)* 匹配带字母和空格的部分。

您可以使用替代品:

re.sub(r'(\d[\d\s]*|[a-z][a-z\s]*)', r'\n', s)

为了更严格地处理尾随空格,您可以这样做:

re.sub(r'(\d(?:[\d\s]*\d)?|[a-z](?:[a-z\s]*[a-z])?)\s*', r'\n', s).rstrip()

这里有两种使用单个正则表达式的方法:

  • 使用条件模式。捕获 </code> 很简单。捕获 <code> 检查我们是否抓取 </code> 或 <code>,然后相应地定义模式的其余部分。

    re.sub(r'((\d)|([a-z])) ((?(2)[a-z]|\d))', r'\n', s)
    
  • 仅替换 space,并用回顾和回顾断言包围它。

    re.sub(r'(?<=\d) (?=[a-z])|(?<=[a-z]) (?=\d)', '\n', s)
    

但是你的两个简单的正则表达式比所有这些废话都好。