正则表达式:匹配行尾的单词但不包括 X

Regex: Match words at end of line but do not include X

我试图从一些地址中获取城市名称的范围,但是我正在努力处理所需的正则表达式。地址格式示例如下。

flat 1, tower block, 34 long road, Major city

flat 1, tower block, 34 long road, town and parking space

34 short road, village on the river and carpark (7X3 8RG)

每种情况下预期要捕获的文本是“主要城市”、“城镇”和“河上的村庄”。问题是地址中有时会包含“and parking space”或变体。在示例 2 的情况下,使用诸如“(?<=,\s)\w+”之类的正则表达式 return“城镇和停车场 space”。

城市总是在地址的最后一个逗号之后。

我已尝试重新处理此 question 但未能成功排除“和停车 space”部分。

我已经创建了一个排除邮政编码的正则表达式,这只是作为答案包含在内,理想情况下允许将正则表达式的那部分用螺栓固定在最后。

我如何创建一个从最后一个逗号开始并运行到地址末尾但在任何“and parking”或邮政编码处停止的正则表达式?

您可以使用

捕获这些字符串
,\s*((?:(?!\sand\s)[^,])*)(?=[^,]*$)
,\s*([^,]*?)(?=(?:\sand\s[^,]*)?$)
.*,\s*((?:(?!\sand\s)[^,])*)
.*,\s*([^,]*?)(?=(?:\sand\s[^,]*)?$)

参见this regex demo or this regex demo

详情:

  • , - 一个逗号]
  • \s* - 零个或多个空格
  • ((?:(?!\sand\s)[^,])*) - 第 1 组:除逗号以外的任何字符,零次或多次出现,不以空格开头 + and + 空格字符序列
  • (?=[^,]*$) - 除了逗号之外,字符串末尾必须有任何零个或多个字符。

在 Python 中,您将使用

m = re.search(r'.*,\s*([^,]*?)(?=(?:\sand\s[^,]*)?$)', text)
if m:
    print(m.group(1))

参见demo

import re
texts = ['flat 1, tower block, 34 long road, Major city',
'flat 1, tower block, 34 long road, town and parking space',
'34 short road, village on the river and carpark (7X3 8RG)']
rx = re.compile(r'.*,\s*([^,]*?)(?=(?:\sand\s[^,]*)?$)')
for text in texts:
    m = re.search(rx, text)
    if m:
        print(m.group(1))

输出:

Major city
town
village on the river

我会做:

import re 

exp = ['flat 1, tower block, 34 long road, Major city',
'flat 1, tower block, 34 long road, town and parking space',
'34 short road, village on the river and carpark (7X3 8RG)']

for e in (re.split(',\s*', x)[-1] for x in exp):
    print(re.sub(r'(?:\s+and car.*)|(?:\s+and parking.*)','',e))

打印:

Major city
town
village on the river

像这样工作:

  1. ,\s* 上拆分字符串并取最后一部分;
  2. 删除该字符串末尾以指定 (?:\s+and car.*)|(?:\s+and parking.*)
  3. 开头的所有内容

您可以使用此方法轻松添加要删除的附加子句。