python - 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?
解决方案
您可以将原始字符串与f-strings
(3.6 版中的新功能)结合使用,但首先您必须转义正则表达式量词上的花括号。
花括号外的字符串部分按字面意思处理,除了任何双花括号“{{”或“}}”被相应的单花括号替换。一个左大括号“{”标记了一个替换字段,它以 Python 表达式开头......
rf"\b(?:{Var1}\W+(?:\w+\W+){{0,{Var3}}}?{Var2}|{Var2}\W+(?:\w+\W+){{0,{Var3}}}?{Var1})\b"
推荐阅读
- amazon-s3 - AWS S3 Glacier 存储恢复到期
- reactjs - 不可分配给类型 IntrinsicAttributes & IntrinsicClassAttributes React.js
- tags - 如何在黄瓜 world.object 中获取标签
- scala - com.cumulocity.sdk.client.SDKException:Http 状态码:401
- asp.net - 未找到 Azure TLS 相互身份验证 X-ARR-ClientCert
- python - AWS Glue Python Shell download_and_install(args.extra_py_files) - download_from_s3(s3_file_path, local_file_path)
- python - 如何在 Python 中保存所有深度学习模型参数?
- python - 遍历 URL 列表并使用 Selenium 打开每个 url
- c# - 如何获得与任务管理器中相同的当前 CPU 时钟速度?
- python - Pandas 和 seaborn 在 x 轴上绘制了意想不到的时间框架