Python 使用正则表达式和include模式拆分字符串
我需要在学位(MSC,BSc,…)上拆分一个字符串,并在第0列保留名称和标题,在第1列保留地址注意Python 使用正则表达式和include模式拆分字符串,python,regex,Python,Regex,我需要在学位(MSC,BSc,…)上拆分一个字符串,并在第0列保留名称和标题,在第1列保留地址注意BS末尾的国家代码与标题匹配 (?<=\bmsc)|(?<=\bbsc)|(?<=\bbs)\s 请在下面找到一些示例数据: Phillipp Shuster MSc Grolmanstraße 6 28195 Bremen Bahnhofsvorstadt DE Eric Jager BSc Mohrenstrasse 29 72362 Nusplingen DE Nykee
BS
末尾的国家代码与标题匹配
(?<=\bmsc)|(?<=\bbsc)|(?<=\bbs)\s
请在下面找到一些示例数据:
Phillipp Shuster MSc Grolmanstraße 6 28195 Bremen Bahnhofsvorstadt DE
Eric Jager BSc Mohrenstrasse 29 72362 Nusplingen DE
Nykee Peters BS Taylor Street, Duncan Town BS
我想完成以下工作:
Phillipp Shuster MSc | Grolmanstraße 6 28195 Bremen Bahnhofsvorstadt DE
Eric Jager BSc | Mohrenstrasse 29 72362 Nusplingen DE
Nykee Peters BS | Taylor Street, Duncan Town BS
我试过了,但这会将标题添加到地址中(不正确)
你可以使用这个伴侣
(?<=\bmsc)|(?<=\bbsc)|(?<=\bbs)\s
(?我建议re.subn
方法:
import re
data = '''Phillipp Shuster MSc Grolmanstraße 6 28195 Bremen Bahnhofsvorstadt DE
Eric Jager BSc Mohrenstrasse 29 72362 Nusplingen DE
Nykee Peters BS Taylor Street, Duncan Town BS'''
pattern = re.compile(r'^.+? (msc|bsc|bs)', flags=re.I)
for line in data.split('\n'):
result = pattern.subn(lambda m: '{:<20s} | '.format(m.group()), line, count=1)
print(result[0])
您可以在findall
中使用带有2个捕获组的简单正则表达式,而不是split
:
reg = r'(?i)^(.*\s[BM]Sc?)\s+(.+)$'
正则表达式说明:
Phillipp Shuster MSc | Grolmanstraße 6 28195 Bremen Bahnhofsvorstadt DE
Eric Jager BSc | Mohrenstrasse 29 72362 Nusplingen DE
Nykee Peters BS | Taylor Street, Duncan Town BS
(?i)
:忽略案例模式
^
:开始
(.*\s[BM]Sc?
:匹配0个以上字符,直到捕获组1中的BSc
或BS
或MS
或Msc
\s+
:匹配1+个空格
(.+)
:匹配1个以上字符,直到在第二个捕获组中结束
$
:结束
My 2c使用re.sub
:
import re
x = """Phillipp Shuster MSc Grolmanstraße 6 28195 Bremen Bahnhofsvorstadt DE
Eric Jager BSc Mohrenstrasse 29 72362 Nusplingen DE
Nykee Peters BS Taylor Street, Duncan Town BS"""
for y in x.split("\n"):
print(re.sub("^(.*?(?:MS|BS)c?)(.*)", r"\1 |\2", y, 0, re.DOTALL))
输出:
Phillipp Shuster MSc | Grolmanstraße 6 28195 Bremen Bahnhofsvorstadt DE
Eric Jager BSc | Mohrenstrasse 29 72362 Nusplingen DE
Nykee Peters BS | Taylor Street, Duncan Town BS
@代码狂热者:我尝试了一个lookbehind,但收到了一个错误lookbehind requires fixed width pattern
“\s(?Tryre.split(r'(?I)(?:)可以通过在bs
前面放置一个空格来处理lookbehind fixed length问题,就像这样:splited=re.split(\s(?=((?:msc | bsc | bs)[^$)”),参与者,flags=re.IGNORECASE)
@Red Cricket:你能解释一下为什么会这样吗?“空间把戏”在做什么?顺便说一句,应该是:splitted=re.split(“\s(?@JohnDoe请看一看