首页 > 解决方案 > Python 的 series.str.contains 框架中的正则表达式中的变量

问题描述

我想在运行正则表达式之前控制/编辑正则表达式的元素作为变量。在我正在使用的正则表达式中,我想在包含 2 个单词的数据框中找到行,这些单词最多被 3 个单词分隔。

此代码使用不带外部变量的正则表达式识别 word1 和 word2:

import re
import pandas as pd

df = pd.DataFrame({'a': ['some text here', 'some text there', 'word1 some more text word2']})
result = df['a'].str.contains(r"\b(?:word1\W+(?:\w+\W+){0,3}?word2|word2\W+(?:\w+\W+){0,3}?word1)\b") 

print(result)
0    False
1    False
2    True
Name: a, dtype: bool

我想要的是达到相同的结果,但能够在正则表达式之外控制 word1、word2 和值 3。

这是我在正则表达式之外定义变量的失败尝试,根据stackoverflow上类似问题的答案进行调整:

import re
import pandas as pd

Var1 = "word1"
Var2 = "word2"
Var3 = "3"


df = pd.DataFrame({'a': ['some text here', 'some text there', 'word1 some more text word2']})
result = df['a'].str.contains(r"\b(?:{Var1}\W+(?:\w+\W+){0,{Var3}}?{Var2}|{Var2}\W+(?:\w+\W+){0,{Var3}}?{Var1})\b") 
   
print(result)
0    False
1    False
2    False
Name: a, dtype: bool

同样,这个也失败了:

result = df['a'].str.contains(r"\b(?:"+Var1+"\W+(?:\w+\W+){0,"+Var3+"}?"+Var2+"|"+Var2+"\W+(?:\w+\W+){0,"+Var3+"}?"+Var1+")\b")    

有没有一种简单的方法来调整正则表达式来读取 Var1 2 和 3?

标签: pythonregexstringdataframecontains

解决方案


您可以将原始字符串与f-strings3.6 版中的新功能)结合使用,但首先您必须转义正则表达式量词上的花括号。

花括号外的字符串部分按字面意思处理,除了任何双花括号“{{”或“}}”被相应的单花括号替换。一个左大括号“{”标记了一个替换字段,它以 Python 表达式开头......

rf"\b(?:{Var1}\W+(?:\w+\W+){{0,{Var3}}}?{Var2}|{Var2}\W+(?:\w+\W+){{0,{Var3}}}?{Var1})\b"

推荐阅读