繁体   English   中英

python 的正则表达式:如何在单词之间提取字符串?

[英]Regex for python: how do I extract a string between words?

假设我有一句话:

Meet me at 201 South First St. at noon

我想得到这样的地址:

South First

什么是合适的正则表达式? 我目前有这个,但它不工作:

 x = re.search(r"\d+\s?=([A-Z][a-z]*)\s(Rd.|Dr.|Ave.|St.)",searchstring)

其中 searchstring 是句子。 地址前面总是有 1 个或多个数字,后跟一个空格,然后是 Rd。 Dr. Ave. 或 St. 地址也总是以大写字母开头。

第一组,您尝试匹配地址的部分是[AZ][az]* ,它表示一个大写字母后跟任何小写字母。 您可能想要的是任何大写或小写字母或空格: [A-Za-z ]* 另请注意,第二组中的点表示任何字符,而不是文字. ,所以你必须逃避它。 解决方案如下所示:

>>> re.search(r'\d+\s?([A-Za-z ]*)\s+(Rd|Dr|Ave|St)\.', 'Meet me at 201 South First St. at noon')[1]
'South First'

或者只是使用. 接受任何东西。

>>> re.search(r'\d+\s?(.*?)\s+(Rd|Dr|Ave|St)\.', 'Meet me at 201 South First St. at noon')[1]
'South First'

您可以使用

\d+\s*([A-Z].*?)\s+(?:Rd|Dr|Ave|St)\.

请参阅正则表达式演示

细节

  • \d+ - 一位或多位数字
  • \s* - 0 个或更多空格
  • ([AZ].*?) - 捕获组 #1:一个大写的 ASCII 字母,然后是除换行符之外的任何 0 个或多个字符,尽可能少
  • \s+ - 1+ 个空格
  • (?:Rd|Dr|Ave|St) - RdDrAveSt
  • \. - 一个点

请参阅Python 演示

m = re.search(r'\d+\s*([A-Z].*?)\s+(?:Rd|Dr|Ave|St)\.', text)
if m:
    print(m.group(1)) 

Output: South First

方法如下:

import re
s = 'Meet me at 201 South First St. at noon'
print(re.findall('(?<=\d )[A-Z].*(?= d.|Dr.|Ave.|St.)', s)[0])

Output:

'South First'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM