как фильтровать строки на основе регулярных выражений на основе Unix, передаваемых в качестве входного аргумента в столбец фрейма данных - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть следующий фрейм данных

import numpy as np
import pandas as pd
import os

csvFile = "csv.csv"
csvDelim = '@@@'
df = pd.read_csv(csvFile, engine="python", index_col=False, delimiter= csvDelim)
df.head()


ID  col_1   
0   ACLKB
1   CLKAA
2   AACLK
3   BBBCLK

Передаваемое регулярное выражение: CLK и имя столбца 'col_1'

text = '*CLK*'
findtext = 'r'+text+".*"
colName = 'Signal'

df[colName].str.match(text)

Iя получаю следующие результаты, которые являются неправильными.

 0     False
 1     False
 2     False
 3     False
 4     False
The expected output is  
 0     True
 1     True
 2     True
 3     True
 4     True

 Can someone help me to filter rows based on regular expression passed as above  
         error                                     Traceback (most recent call last)
        <ipython-input-110-8d1c1b6b2d15> in <module>()
     ----> 1 df['Signal'].str.match(findtext)

              ~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\strings.py in match(self, pat, case, flags, na, as_indexer)
              1571     def match(self, pat, case=True, flags=0, na=np.nan, as_indexer=None):
              1572         result = str_match(self._data, pat, case=case, flags=flags, na=na,
        ->    1573                            as_indexer=as_indexer)
              1574         return self._wrap_result(result)
               1575 

            ~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\strings.py in str_match(arr, pat, case, flags, na, as_indexer)
       495         flags |= re.IGNORECASE
       496 
    --> 497     regex = re.compile(pat, flags=flags)
      498 
      499     if (as_indexer is False) and (regex.groups > 0):

     ~\AppData\Local\Continuum\anaconda3\lib\re.py in compile(pattern, flags)
     231 def compile(pattern, flags=0):
     232     "Compile a regular expression pattern, returning a pattern object."
  --> 233     return _compile(pattern, flags)
     234 
     235 def purge():

  ~\AppData\Local\Continuum\anaconda3\lib\re.py in _compile(pattern, flags)
   299     if not sre_compile.isstring(pattern):
   300         raise TypeError("first argument must be string or compiled pattern")

-> 301 p = sre_compile.compile (pattern, flags) 302, если нет (flags & DEBUG): 303, если len (_cache)> = _MAXCACHE:

 ~\AppData\Local\Continuum\anaconda3\lib\sre_compile.py in compile(p, flags)
   560     if isstring(p):
   561         pattern = p

-> 562 p = sre_parse.parse (p, flags) 563 else: 564 pattern = None

    ~\AppData\Local\Continuum\anaconda3\lib\sre_parse.py in parse(str, flags, pattern)
    853 
    854     try:

-> 855 p = _parse_sub (source,pattern, flags & SRE_FLAG_VERBOSE, 0) 856 кроме Verbose: 857 # флаг VERBOSE был включен внутри шаблона.быть

  ~\AppData\Local\Continuum\anaconda3\lib\sre_parse.py in _parse_sub(source, state, verbose, nested)
     414     while True:
     415         itemsappend(_parse(source, state, verbose, nested + 1,

-> 416 не вложенные и не элементы)) 417, если не sourcematch ("|"): 418 break

    ~\AppData\Local\Continuum\anaconda3\lib\sre_parse.py in _parse(source, state, verbose, nested, first)
     614             if not item or (_len(item) == 1 and item[0][0] is AT):
     615                 raise source.error("nothing to repeat",

-> 616 source.tell() - здесь + len (this)) 617, если item [0] [0] в _REPEATCODES: 618 повысить source.error («многократное повторение»,

     error: nothing to repeat at position 0

. Кроме того, регулярное выражение также может быть^ CLK или? CLK или любое другое регулярное выражение, что является общим решением для устранения проблемы, когда передана любая строка с регулярным выражением

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

удалите звездочки (*) и используйте метод .contains вместо метода .match.Используйте case=False, чтобы найти заглавные и строчные буквы

см. Этот код:

text = 'CLK'
findtext = 'r'+text+".*"
colName = 'Signal'

df[colName].str.contains(text, case=False)
0 голосов
/ 22 сентября 2018

Полагаю, вам нужно удалить 'r' во второй строке кода ниже:

text = '*CLK*'
findtext = 'r'+text+".*"
colName = 'Signal'

Похоже, вы пытаетесь создать строку с исходным кодом Python, если вы используете python3 или более позднюю версию.в этом нет необходимости.

Кроме того, используемое вами регулярное выражение не подходит для того, что вы хотите, попробуйте следующее, вы можете попробовать поэкспериментировать с https://pythex.org/, чтобы создать необходимое регулярное выражение.Если все, что вы пытаетесь сделать, это сопоставить строки, содержащие CLK findtext = '. * CLK'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...