str.contains не поддерживает разрыв строки или обратную строку sh в Python - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь отфильтровать строки, если abbreviation содержит 'CS', 'DE', 'CM' с isin и str.contains методами:

id,abbreviation,countries
1,CH,Switzerland
2,CZ,Czech Republic
3,CL,Chile
4,CM,Cameroon
5,CN,China
6,DJ,Djibouti
7,CR,Costa Rica
8,CS,Czech
9,DE,Germany
10,CY,Cyprus

Когда я не использую перевод строки или backsla sh, оба работать гладко и получить тот же результат:

mask1 = df['abbreviation'].str.contains('CS|DE|CM')
df[mask1]
mask2 = df['abbreviation'].isin(['CS', 'DE', 'CM'])
df[mask2]

Out:

   id abbreviation countries
3   4           CM  Cameroon
7   8           CS     Czech
8   9           DE   Germany

Но я заметил, что при использовании backsla sh, если для фильтрации слишком много значений, str.contains завершится неудачно чтобы дать правильный ответ, но isin все еще работает.

Первый вариант с backsla sh, только отфильтровать CS содержащиеся строки:

mask1 = df['abbreviation'].str.contains('CS|\
        DE|\
        CM')
df[mask1]

Out:

   id abbreviation countries
7   8           CS     Czech

Второй вариант с backsla sh дает правильный результат:

mask2 = df['abbreviation'].isin(['CS', \
          'DE', \
          'CM'])
df[mask2]

Out:

   id abbreviation countries
3   4           CM  Cameroon
7   8           CS     Czech
8   9           DE   Germany

Просто интересно, кто-нибудь может дать мне совет, как решить эту проблему , если я хочу использовать разрыв строки для str.contains? Спасибо.

1 Ответ

2 голосов
/ 13 марта 2020

str.contains атрибут, (из документации) подпись функции,

str.contains(pat, case=True, flags=0, na=nan, regex=True)

В Python, по умолчанию, шаблон регулярного выражения ( pat выше) не допускает пробелы / переносы строк.

Когда шаблон должен быть более читабельным, например, с комментариями, пробелами (которые следует игнорировать) и т. Д. c., Вы должны предоставить re.VERBOSE (do c re. VERBOSE ) для вызова функции

Так что для вашего кода, чтобы использовать намеченный шаблон,


In [52]: mask1 = df['abbreviation'].str.contains('CS|\    
    ...:         DE|\                                     
    ...:         CM', flags=re.VERBOSE)                   
    ...: df[mask1]

Out[52]:                                                  
   id abbreviation countries                              
3   4           CM  Cameroon                              
7   8           CS     Czech                              
8   9           DE   Germany                              
...