我想替换
之类的字符串'''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.findall
和groups
但我想找到更简单的方法吗?
答案 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()