python正则表达式用一个命令替换两种情况

2024-10-03 00:17:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把绳子换成

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

^{pr2}$

这就是我的方法:

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

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


Tags: 方法reonegroupsexpression绳子regularabcde
3条回答

我真的认为最简单的方法是使用findall而不是拆分或{}-ing来匹配:

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

或者在一行中:

^{pr2}$

给出:

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]+)*用字母和空格匹配部分。在

也可以使用正则表达式:

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

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

以下是使用单个正则表达式执行此操作的两种方法:

  • 使用条件模式。捕获\1很简单。Capture\4检查我们是抓取\2还是{},然后相应地定义模式的其余部分。在

    re.sub(r'((\d)|([a-z])) ((?(2)[a-z]|\d))', r'\1\n\4', s)
    
  • 只替换空格,并用lookbehind和lookahead断言包围它。在

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

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

相关问题 更多 >