【问题标题】:How to test string contains one of the substrings in a list, in pandas?如何在熊猫中测试字符串包含列表中的一个子字符串?
【发布时间】:2020-06-22 13:43:00
【问题描述】:

此问题来自this stackoverflow question

s = pd.Series(['cat)','hat)','dog)','fog)','pet)'])
searchfor = ['og)', 'at)']
s[s.str.contains('|'.join(searchfor))]

错误信息是

error                                     
Traceback (most recent call last)
<ipython-input-208-b103d01401d9> in <module>
      1 searchfor = ['og)', 'at)']
----> 2 s[s.str.contains('|'.join(searchfor))]

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\strings.py in contains(self, pat, case, flags, na, regex)
   2521     def contains(self, pat, case=True, flags=0, na=np.nan, regex=True):
   2522         result = str_contains(self._parent, pat, case=case, flags=flags, na=na,
-> 2523                               regex=regex)
   2524         return self._wrap_result(result, fill_value=na)
   2525 

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\strings.py in str_contains(arr, pat, case, flags, na, regex)
    297             flags |= re.IGNORECASE
    298 
--> 299         regex = re.compile(pat, flags=flags)
    300 
    301         if regex.groups > 0:

C:\ProgramData\Anaconda3\lib\re.py in compile(pattern, flags)
    232 def compile(pattern, flags=0):
    233     "Compile a regular expression pattern, returning a Pattern object."
--> 234     return _compile(pattern, flags)
    235 
    236 def purge():

C:\ProgramData\Anaconda3\lib\re.py in _compile(pattern, flags)
    284     if not sre_compile.isstring(pattern):
    285         raise TypeError("first argument must be string or compiled pattern")
--> 286     p = sre_compile.compile(pattern, flags)
    287     if not (flags & DEBUG):
    288         if len(_cache) >= _MAXCACHE:

C:\ProgramData\Anaconda3\lib\sre_compile.py in compile(p, flags)
    762     if isstring(p):
    763         pattern = p
--> 764         p = sre_parse.parse(p, flags)
    765     else:
    766         pattern = None

C:\ProgramData\Anaconda3\lib\sre_parse.py in parse(str, flags, pattern)
    942     if source.next is not None:
    943         assert source.next == ")"
--> 944         raise source.error("unbalanced parenthesis")
    945 
    946     if flags & SRE_FLAG_DEBUG:

error: unbalanced parenthesis at position 2

预期的输出是

0    cat)
1    hat)
2    dog)
3    fog)

不平衡括号在哪里? 我猜不出答案:-( (看起来您的帖子主要是代码;请添加更多详细信息。)

【问题讨论】:

  • 您的正则表达式中有paranethesis。您应该使用import re; searchfor = [re.escape(_) for _ in searchfor],然后使用 pandas 调用。
  • @DOOM 我之前尝试过在 python 中学习正则表达式,但不太成功。如果您愿意提供详细的答案,我会检查并接受。
  • @DOOM 抱歉,Quang Hoang 追上了你。

标签: python string pandas dataframe contains


【解决方案1】:

) 是一个特殊的regex 字符。你需要逃跑:

searchfor = ['og\)', 'at\)']
s[s.str.contains('|'.join(searchfor))]

输出:

0    cat)
1    hat)
2    dog)
3    fog)
dtype: object

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 2021-09-28
    • 2018-05-28
    • 2018-08-08
    • 2017-02-07
    • 2017-12-29
    • 2015-09-16
    相关资源
    最近更新 更多