#python #pandas #string #dataframe
Вопрос:
Я хотел бы проверить, содержит ли столбец фрейма данных pandas id
следующие подстроки '.F1', '.N1', '.FW', '.SP'
.
В настоящее время я использую следующие коды:
searchfor = ['.F1', '.N1', '.FW', '.SP']
mask = (df["id"].str.contains('|'.join(searchfor)))
id
Колонка выглядит так:
ID
0 F611B4E369F1D293B5
1 10302389527F190F1A
На самом деле я хочу посмотреть id
, содержит ли столбец четыре подстроки, начинающиеся с a .
. По каким-то причинам F1
будут отфильтрованы. В текущем примере этого нет .F1
. Я был бы очень признателен, если бы кто-нибудь дал мне знать, как решить эту конкретную проблему. Огромное спасибо.
Комментарии:
1.
.
соответствует чему угодно. Таким образом, выражение.F1
будет любым, за которым последуетF1
. Обе строки имеют этот шаблон.9F1
в индексе 0 и7F1
и0F1
в индексе 1. Также неясно, как вы используете маску, так как она должна соответствовать обоим показанным идентификаторам.2. Вы можете сбежать с
'.F1'
или сre.escape()
3.
df["ID"].str.contains('\' '|\'.join(searchfor))
4. @AndrejKesely большое вам спасибо за предложение. Просто чтобы убедиться, что это будет побег с «.F1» в первом ряду, верно?
5. @SkipperLin Попробуй это
searchfor = ['.F1', '.N1', '.FW', '.SP']
Ответ №1:
Вы можете использовать re.escape()
для экранирования мета-символов регулярного выражения следующий способ, чтобы вам не нужно было экранировать каждую строку в списке слов searchfor
(нет необходимости изменять определение searchfor
).:
import re
searchfor = ['.F1', '.N1', '.FW', '.SP'] # no need to escape each string
pattern = '|'.join(map(re.escape, searchfor)) # use re.escape() with map()
mask = (df["id"].str.contains(pattern))
re.escape()
будет экранировать каждую строку для вас:
print(pattern)
'\.F1|\.N1|\.FW|\.SP'