繁体   English   中英

基于正则表达式提取单词

[英]Extract words based on regex

我试图提取出现在单词 SUITE、suite、ste、Ste 之后的任何内容。 或熊猫数据框列中的字符 # 。 例子如下

4230 Harding Pike Ste 435
4230 Harding Pike Suite 435
4230 Harding Pike SUITE A
4230 Harding Pike Ste. 101
4230 Harding Pike SUITE B-200
4230 Harding Pike #900
4230 Harding Pike STE 503
4230 Harding Pike SUITE 300
4230 Harding Pike Ste 700
4230 Harding Pike SUITE #2

结果:

SuiteNos

435
435  
A
101
B-200
900
503
300
700
2

我尝试使用以下正则表达式,但它没有按预期工作 -

 df_merged['address'].str.extract(r'\**\**suite.*\**\**')
 df_merged['address'] = re.findall('@([suite]+)', df_merged['address'])

使用不区分大小写的匹配,您可以使用带有交替的捕获组:

(?i)(?:#|Suite|ste\.?)\s*([^\s#].*)

模式匹配:

  • (?:非捕获组
    • Suite匹配字面意思
    • | 或者
    • ste\\.? 将 ste 与可选点匹配
    • | 或者
    • #逐字匹配
  • )关闭非捕获组
  • \\s*匹配可选的空白字符
  • ([^\\s#].*)捕获组 1,从匹配不带 # 的非空白字符开始,以及该行的其余部分

正则表达式演示

strings = [
    "4230 Harding Pike Ste 435",
    "4230 Harding Pike Suite 435",
    "4230 Harding Pike SUITE A",
    "4230 Harding Pike Ste. 101",
    "4230 Harding Pike SUITE B-200",
    "4230 Harding Pike #900",
    "4230 Harding Pike STE 503",
    "4230 Harding Pike SUITE 300",
    "4230 Harding Pike Ste 700",
    "4230 Harding Pike SUITE #2"
]

pattern = r"(?i)(?:#|Suite|ste\.?)\s*([^\s#].*)"
df_merged = pd.DataFrame(strings, columns = ['address'])
df_merged['SuiteNos'] = df_merged['address'].str.extract(pattern)

print(df_merged)

输出

0      435
1      435
2        A
3      101
4    B-200
5      900
6      503
7      300
8      700
9        2

使用您显示的示例,请尝试以下正则表达式。

[Ss](?:[uU][iI])?[tT][eE](?:[.])?\s+#?(\S+)

Pandas 中运行以下代码:

df['value'].str.extract(r'[Ss](?:[uU][iI])?[tT][eE](?:[.])?\s+#?(\S+)')

Pandas 中的上述代码和 OP 提供的示例的输出如下:

0      435
1      435
2        A
3      101
4    B-200
5      NaN
6      503
7      300
8      700
9        2
Name: value, dtype: object

上述正则表达式的在线演示

说明:为以上添加详细说明。

[Ss]           ##Matching small OR capital S here.
(?:[uU][iI])?  ##In a non-capturing group matching u/U i/I and keep this optional.
[tT][eE]       ##Matching t or T followed by e or E here.
(?:[.])?       ##In a non-capturing group matching . and keeping it optional.
\s+#?          ##Matching 1 or more occurrences of space here followed by # and keeping it optional match here.
(\S+)          ##Creating 1st and only capturing group to catch everything non-space here.

暂无
暂无

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

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