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

У меня есть следующая строка:

27223525

West Food Group B.V.9

52608670

Westcon

Group European Operations Netherlands Branch

30221053

Westland Infra Netbeheer B.V.

27176688

Wetransfer  85 B.V.

34380998

WETRAVEL B.V.

70669783

Эта строка содержит много символов новой строки, я хотел явно игнорировать их, а также все многозначные числа с 6 или более числами.Я придумал следующее выражение регулярного выражения:

[^\n\d{6,}].+

Это почти приводит меня туда, поскольку возвращает все названия компаний, однако в тех случаях, когда само название компании содержит символ новой строки, они возвращаются как два разныхназвания компаний.Например, Westcon является совпадением, а Group European Operations Netherlands Branch также совпадает.Я хотел бы настроить приведенное выше выражение, чтобы убедиться, что окончательное совпадение равно Westcon European Operations Netherlands Branch.Какие понятия регулярных выражений я должен использовать для достижения этой цели?Спасибо.

РЕДАКТИРОВАТЬ Я попробовал следующее на основе комментария ниже, но получил неправильный результат

text = 'West Food Group B.V.9\n \n52608670\n \nWestcon\n \nGroup European Operations Netherlands Branch\n \n30221053\n \nWestland Infra Netbeheer B.V.\n \n27176688\n \nWetransfer 85 B.V.\n \n34380998\n \nWETRAVEL B.V.\n \n70669783\n \nWeWork Companies (International) B.V.\n \n61501220\n \nWeWork Netherlands B.V.\n \n61505439\n \nWexford Finance B.V.\n \n27124941\n \nWFC\n-\nFood Safety B.V.\n \n11069471\n \nWhale Cloud Technology Netherlands B.V.\n \n63774801\n \nWHILL Europe B.V.\n \n72465700\n \nWhirlpool Nederland B.V.\n \n20042061\n \nWhitaker\n-\nTaylor Netherlands B.V.\n \n66255163\n \nWhite Oak B.V.\n'

re.findall(r'[^\n\d{6,}](?:(?:[a-z\s.]+(\n[a-z\s.])*)|.+)',text)

Ответы [ 5 ]

0 голосов
/ 03 января 2019

Вот еще один ответ, основанный на ваших правках:

text = 'West Food Group B.V.9\n \n52608670\n \nWestcon\n \nGroup European Operations Netherlands Branch\n \n30221053\n \nWestland Infra Netbeheer B.V.\n \n27176688\n \nWetransfer 85 B.V.\n \n34380998\n \nWETRAVEL B.V.\n \n70669783\n \nWeWork Companies (International) B.V.\n \n61501220\n \nWeWork Netherlands B.V.\n \n61505439\n \nWexford Finance B.V.\n \n27124941\n \nWFC\n-\nFood Safety B.V.\n \n11069471\n \nWhale Cloud Technology Netherlands B.V.\n \n63774801\n \nWHILL Europe B.V.\n \n72465700\n \nWhirlpool Nederland B.V.\n \n20042061\n \nWhitaker\n-\nTaylor Netherlands B.V.\n \n66255163\n \nWhite Oak B.V.\n'

company_name_regex = re.findall(r'[A-Za-z].*|[A-Za-z].*\d{1,5}.*', text)

for i in range(len(company_name_regex)):

  if i < len(company_name_regex) - 1:

    previous_company_name =  company_name_regex[i]
    next_company_name = company_name_regex[i + 1]
    if 'Westcon' in previous_company_name and 'Group European Operations Netherlands Branch' in next_company_name:
        company_name = ' '.join([previous_company_name, next_company_name])
    else:
        if not 'Group European Operations Netherlands Branch' in previous_company_name:
           company_name = previous_company_name


**OUTPUTS**:
West Food Group B.V.9
Westcon Group European Operations Netherlands Branch
Westland Infra Netbeheer B.V.
Wetransfer 85 B.V.
WETRAVEL B.V.
WeWork Companies (International) B.V.
WeWork Netherlands B.V.
Wexford Finance B.V.
WFC
Food Safety B.V.
Whale Cloud Technology Netherlands B.V.
WHILL Europe B.V.
Whirlpool Nederland B.V.
Whitaker
Taylor Netherlands B.V.
0 голосов
/ 02 января 2019

Если названия вашей компании начинаются с буквы, вы можете использовать это регулярное выражение с модификатором re.M:

^[a-zA-Z].*(?:\n+[a-zA-Z].*)*(?=\n+\d{6,}$)

RegEx Demo

В питоне:

regex = re.compile(r"^[a-zA-Z].*(?:\n+[a-zA-Z].*)*(?=\n+\d{6,}$)", re.M)

Это соответствует строке, которая начинается с [a-zA-Z] до конца строки, а затем соответствует большему количеству строк, разделенных \n, которые также начинаются с [a-zA-Z] символов.

(?=\n+\d{6,}$) - это предварительное утверждение, позволяющее удостовериться в том, что названия наших компаний имеют новую строку и 6+ цифр впереди.

0 голосов
/ 02 января 2019

Я думаю, что вам нужны только названия компаний.Если так, это должно работать.

input = '''27223525

West Food Group B.V.9

52608670

Westcon

Group European Operations Netherlands Branch

30221053

Westland Infra Netbeheer B.V.

27176688

Wetransfer 85 B.V.

34380998

WETRAVEL B.V.

70669783

'''

company_name_regex = re.findall(r'[A-Za-z].*|[A-Za-z].*\d{1,5}.*', input)

pprint(company_name_regex)

['West Food Group B.V.9',
 'Westcon',
 'Group European Operations Netherlands Branch',
 'Westland Infra Netbeheer B.V.',
 'Wetransfer 85 B.V.'
 'WETRAVEL B.V.']
0 голосов
/ 02 января 2019

Если вы можете решить это без регулярного выражения, то должно быть решено без регулярного выражения:

useful = []

for line in text.split():
    if line.strip() and not line.isdigit():
        useful.append(line)

Это должно работать - более или менее. Отвечаю с моего телефона, поэтому не могу проверить.

0 голосов
/ 02 января 2019

Это создаст одну группу для строк, которые не имеют номеров.

регулярное выражение: /(?!(\d{6,}|\n))[a-zA-Z .\n]+/g

Демо: https://regex101.com/r/MMLGw6/1

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