在Python/pandas中使用正则表达式查找城市名称

在Python/pandas中使用正则表达式查找城市名称,python,regex,pandas,Python,Regex,Pandas,我有一个字符串组成的数据框,其中包含一些随机的字母字符串,后跟一个潜在的城市和州。但是,间距是不规则的 例如,我对解析感兴趣的列 blah burlingtonvt blahessex vt blah dover vt blahnorthchittendenvt blah essex junctionvt 用我想保留的字母数字字符串(每行可能不同)替换每个“废话”,并用数十万次观察和美国大陆各地的城市和州替换。由于状态代码总是出现在末尾,因此我可以使用如下正则表达式轻松地提取它 (ny$|tx

我有一个字符串组成的数据框,其中包含一些随机的字母字符串,后跟一个潜在的城市和州。但是,间距是不规则的

例如,我对解析感兴趣的列

blah burlingtonvt
blahessex vt
blah dover vt
blahnorthchittendenvt
blah essex junctionvt
用我想保留的字母数字字符串(每行可能不同)替换每个“废话”,并用数十万次观察和美国大陆各地的城市和州替换。由于状态代码总是出现在末尾,因此我可以使用如下正则表达式轻松地提取它

(ny$|tx$|vt$|...)
其中,“…”正如您所期望的,只是其他州。然后,我分别为每个状态处理数据帧的每个子集。我有一个列表,列出了一个给定州所有可能的城市“错距”,我已经将其转换成正则表达式。i、 e

x = '(essex[ ]{0,1}junction|north[ ]{0,1}chittenden|essex|...)'
此正则表达式中的城市名称变体数量有时会达到数千。然后我运行下面的行

df['city'] = df['string'].str.extract(x, expand=True)
返回

  string                  state   city
1 blah waterbury cenvt    vt      waterbury
2 blah waterbury vt       vt
3 blah waterbury vt       vt
4 blah vt                 vt
5 blah shelburne vt       vt
6 blah waterbury vt       vt
7 blah richmond vt        vt      richmond
但如果我跑,比如说

df['city'] = df['string'].str.extract('(waterbury|shelburne|richmond)', expand=True)
结果与预期一致。为什么会这样?我以编程方式生成正则表达式,所以我想说这不是因为打字错误。有没有可能是因为有太多东西要找?有更好的方法吗


编辑:事实证明,在数千个我认为不存在的城市名称中隐藏着一个空字符串。

考虑以下方法:

In [5]: lst = ['waterbury','shelburne','richmond']

In [6]: pat = '({})'.format('|'.join([r'\b{}\b'.format(x) for x in lst]))

In [7]: pat
Out[7]: '(\\bwaterbury\\b|\\bshelburne\\b|\\brichmond\\b)'

In [8]: df['string'].str.extract(pat, expand=True)
Out[8]:
           0
0  waterbury
1  waterbury
2  waterbury
3        NaN
4  shelburne
5  waterbury
6   richmond

“\b”是什么?为什么需要使用原始字符串?您使用原始字符串完全是因为有“\b”吗?我实际上遇到了另一个问题,可以用它来解决。@user49007。为了方便起见,我使用了原始字符串,所以我不必关心转义特殊(RegEx)符号