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

时间:2015-03-27 12:10:45

标签: python regex replace

我想替换

之类的字符串
'''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'\1\n\2', s)
s = re.sub(r'([a-z]) (\d)', r'\1\n\2', s)

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

5 个答案:

答案 0 :(得分:2)

我认为最简单的方法是使用findall进行匹配,而不是分割或sub

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]+)*将字母与空格匹配。

答案 1 :(得分:1)

您可以使用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命令将替换一个或多个空格,这些空格存在于数字和字母之间或字母和带有换行符的数字之间。

答案 2 :(得分:1)

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

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

它将匹配或组2&amp; 3或4组&amp; 5. =]

答案 3 :(得分:1)

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

  • 使用条件模式。捕获\1非常简单。捕获\4会检查我们是否抓取\2\3,然后相应地定义其余模式。

    re.sub(r'((\d)|([a-z])) ((?(2)[a-z]|\d))', r'\1\n\4', s)
    
  • 仅替换空格,并使用后视和前瞻声明将其包围。

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

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

答案 4 :(得分:0)

您可以使用替代品:

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

要使用尾随空格更加严谨,您可以这样做:

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