如何 Python 被一个字符分割却又保持那个字符?

How to Python split by a character yet maintain that character?

Google 地图结果通常这样显示:

'\n113 W 5th St\nEureka, MO, United States\n(636) 938-9310\n'

另一种变体:

'Clayton Village Shopping Center, 14856 Clayton Rd\nChesterfield, MO, United States\n(636) 227-2844'

还有一个:

'Wildwood, MO\nUnited States\n(636) 458-7707'

注意 \n 字符位置的变化。

我希望提取前 X 行作为地址,最后一行作为 phone 数字。诸如 (.*\n.*)\n(.*) 之类的正则表达式对于第一个示例就足够了,但对于其他两个则不够。我唯一可以依赖的是 phone 数字将采用 (ddd) ddd-dddd.

的形式

我认为很难找到一个允许每一种可能的变化的正则表达式。是否可以使用 split(),但保持我们拆分的字符?那么在这个例子中,通过"("拆分,拆分出地址和phone号码,但是在phone号码中保留这个字符?我可以将 "(" 连接回 split("(")[1],但是有没有更简洁的方法?

不要使用正则表达式。只需拆分 '\n' 上的字符串即可。最后一个索引是一个phone数字,其他索引是地址。

lines   = inputString.split('\n')
phone   = lines[-1] if lines[-1].match(REGEX_PHONE_US) else None
address = '\n'.join(lines[:-1]) if phone else inputString

Python 有很多很棒的内置工具,可以比正则表达式更……人性化的方式……处理字符串。

如果我没理解错的话,你想要"extract the first X lines as address"。假设您需要的所有地址都在美国,这个正则表达式代码应该适合您。无论如何,它适用于您提供的 3 个示例:

import re
x = 'Wildwood, MO\nUnited States\n(636) 458-7707'
print re.findall(r'.*\n+.*\States', x)

输出为:

['Wildwood, MO\nUnited States']

如果你想在以后不使用 \n 打印它,你可以这样做:

x = '\n113 W 5th St\nEureka, MO, United States\n(636) 938-9310\n'
y = re.findall(r'.*\n+.*\States', x)
y = y[0].rstrip()

当您打印 y 输出时:

113 W 5th St
Eureka, MO, United States

而且,如果您想单独提取 phone 号码,您可以这样做:

tel = '\n113 W 5th St\nEureka, MO, United States\n(636) 938-9310\n'
num = re.findall(r'.*\d+\-\d+', tel)
num = num[0].rstrip()

当您打印 num 输出时:

(636) 938-9310