使用regex和include模式拆分字符串

2024-09-30 20:23:18 发布

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

我需要在学位(MSC,BSc,…)上拆分一个字符串,并在第0列保留名称和标题,在第1列保留地址。注意结尾的国家代码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

我想完成如下:

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

我试过了,但这会将标题添加到地址(不正确)。你知道吗

splitted=re.split("\s(?=(?:msc|bsc|bs)[^$])",participants, flags=re.IGNORECASE)

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

Tags: 标题bsdeericpetersbscbremenmohrenstrasse
3条回答

我建议采用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])

输出:

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

代替split,您可以在findall中使用带有2个捕获组的简单正则表达式:

reg = r'(?i)^(.*\s[BM]Sc?)\s+(.+)$'

RegEx Demo

正则表达式描述:

  • (?i):忽略大小写模式
  • ^:开始
  • (.*\s[BM]Sc?):匹配0+个字符,直到捕获组1中的BScBSMSMsc
  • \s+:匹配1+个空格
  • (.+):匹配1+个字符,直到第二个捕获组结束
  • $:结束

你可以使用这个伴侣

(?<=\bmsc)|(?<=\bbsc)|(?<=\bbs)\s
  • (?<=\bmsc)-匹配msc。你知道吗
  • (?<=\bbsc)-匹配bsc。你知道吗
  • (?<=\bbs)-匹配bs。你知道吗
  • \s-匹配空格。你知道吗

Demo

相关问题 更多 >