Разделить строку с помощью регулярных выражений и включить шаблон - PullRequest
0 голосов
/ 15 декабря 2018

Мне нужно разделить строку на степень (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

Ответы [ 4 ]

0 голосов
/ 15 декабря 2018

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

Python Demo
Regex Demo

0 голосов
/ 15 декабря 2018

Вместо разделения я бы предложил 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
0 голосов
/ 15 декабря 2018

Вместо split вы можете использовать это простое регулярное выражение с двумя захваченными группами в findall:

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

Демонстрация RegEx

RegExОписание:

  • (?i): режим игнорирования регистра
  • ^: запуск
  • (.*\s[BM]Sc?): сопоставление 0+ символов до BScили BS или MS или Msc в группе захвата 1
  • \s+: совпадение с 1+ пробелами
  • (.+): сопоставление 1+ символов до конца во второй группе захвата
  • $: конец
0 голосов
/ 15 декабря 2018

Вы можете использовать этот помощник

(?<=\bmsc)|(?<=\bbsc)|(?<=\bbs)\s
  • (?<=\bmsc) - совпадения msc.
  • (?<=\bbsc) - совпадения bsc.
  • (?<=\bbs) - совпадения bs.
  • \s - совпадения пробелов.

Демонстрация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...