如何将自动的正则表达式字符串作为参数传递给Python中的函数?

问题描述 投票:0回答:1

我想构建一个正则表达式,其中中间部分来自列表。正则表达式将是str.contains()函数中的一个参数。我已经将正则表达式开发为字符串,并带有和不带双引号,如此处[[Passing a string as an argument to a python script)所述,但是结果与将正则表达式直接键入函数中的结果不同。关于如何从类型化表达式中获得相同行为以及将表达式作为字符串传递的任何想法?

在下面的代码中,我搜索名为text_pd的pd对象的Column1,以为包含“ word1”和/或“ word2”的每一行返回True。我从一些玩具数据开始,并在其中两个条目周围引入了一些空白(注意我的实际数据问题是以句子的形式):

import pandas as pd
data = [['word1',1],['word2',2],[' word1 ',3],['word3',4],[' word2 ',5]]
text_pd = pd.DataFrame(data, columns = ['Column1', 'ID'])
print(text_pd)
>>>   Column1  ID
  0    word1   1
  1    word2   2
  2   word1    3
  3    word3   4
  4   word2    5

我现在将执行所需的直接正则表达式,并正确地发现5条记录中有4条包含文本。

text_proxies = text_pd['Column1'].str.contains(r"\b(?:word1|word2)\b",regex=True)
text_proxies = np.asarray(text_proxies)
text_proxies.sum()/text_proxies.size
>>> 0.8

当通过来自列表的连接字符串传递相同的regex表达式时,匹配下降到0%。

remove_word_list = np.array(["word1","word2"],dtype=object)
remove_words_string = '|'.join([''.join(row) for row in remove_word_list])
remove_words_string = 'r' + '"' + '\\' + 'b(?:' + remove_words_string + ')' + '\\' + 'b' + '"'
print(remove_words_string)
>>> r"\b(?:word1|word2)\b"

text_proxies = text_pd['Column1'].str.contains(str(print(remove_words_string)),regex=True)
text_proxies = np.asarray(text_proxies)
text_proxies.sum()/text_proxies.size
>>> r"\b(?:word1|word2)\b"
>>> 0.0

字符串在传递给str.contains()方法时被打印出来,并且符合预期。在我的实际数据中,我发现连接字符串方法比直接正则表达式参数产生更多的匹配。这可能与我的实际数据中的各种类型的空白元素有关。关于如何在str.contains()方法中正确地将字符串作为参数传递的任何提示,该字符串需要作为正则表达式来处理?

python regex string parameter-passing
1个回答
0
投票
text_proxies = text_pd['Column1'].str.contains(str(print(remove_words_string)),regex=True)

应该是

text_proxies = text_pd['Column1'].str.contains(str(remove_words_string),regex=True)

您正在尝试将“ print”的返回值转换为字符串。只需删除打印功能即可。

© www.soinside.com 2019 - 2024. All rights reserved.