使用正则表达式基于重复模式(不包括换行符)进行提取

时间:2019-01-02 14:36:12

标签: python regex

我有一个字符串如下:

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 :(得分:1)

这将为没有数字的行创建一组。

regex:/(?!(\d{6,}|\n))[a-zA-Z .\n]+/g

演示:https://regex101.com/r/MMLGw6/1

答案 1 :(得分:1)

我认为您只需要公司名称。如果是这样,这应该起作用。

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.']

答案 2 :(得分:0)

如果您可以不用正则表达式来解决它,应该不使用正则表达式来解决:

useful = []

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

应该起作用-或多或少。通过电话回复,因此无法测试。

答案 3 :(得分:0)

假设公司名称以字母开头,则可以将此正则表达式与re.M修饰符一起使用:

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

RegEx Demo

在python中:

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位以上的数字。

答案 4 :(得分:0)

这是根据您对问题的修改而得出的另一个答案:

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.