2015-11-11 3 views
1

Я задаюсь вопросом, есть ли способ объединить модели с re.sub() вместо использования мультипликаторов, как показано ниже:Python Regex к югу() с несколькими шаблонами

import re 
s1 = "Please check with the store to confirm holiday hours." 
s2 = ''' Hours: 
      Monday: 9:30am - 6:00pm 
Tuesday: 9:30am - 6:00pm 
Wednesday: 9:30am - 6:00pm 
Thursday: 9:30am - 6:00pm 
Friday: 9:30am - 9:00pm 
Saturday: 9:30am - 6:00pm 
Sunday: 11:00am - 6:00pm 

Please check with the store to confirm holiday hours.''' 

strip1 = re.sub(s1, '', s2) 
strip2 = re.sub('\t', '', strip1) 
print(strip2) 

Желаемый результат:

Hours: 
Monday: 9:30am - 6:00pm 
Tuesday: 9:30am - 6:00pm 
Wednesday: 9:30am - 6:00pm 
Thursday: 9:30am - 6:00pm 
Friday: 9:30am - 9:00pm 
Saturday: 9:30am - 6:00pm 
Sunday: 11:00am - 6:00pm 
+1

Если вы хотите использовать 's1' как литеральное регулярное выражение, вы должны называть его' re.escape', чтобы исключить случайные символы из него как специальные символы регулярных выражений и/или сделать его сырым строковым литералом с Префикс 'r', например 'r'Пожалуйста, проверьте ... ''. Если вы хотите удалить каждое слово компонента, вам придется разбить его и заменить каждую часть. – ShadowRanger

ответ

2

Если вы просто пытаетесь удалить конкретные подстроки, вы можете комбинировать шаблоны с чередованием для одного удаления прохода:

pat1 = r"Please check with the store to confirm holiday hours." 
pat2 = r'\t' 
combined_pat = r'|'.join((pat1, pat2)) 
stripped = re.sub(combined_pat, '', s2) 

Это сложнее, если «шаблоны» использовать фактические регулярные выражения специальных символы (потому что тогда вам нужны беспокоиться о том, чтобы обернуть их, чтобы чередование ломалось в нужных местах), но для простых фиксированных шаблонов это просто.

Если вы имели реальные регулярные выражения, а не фиксированные образцы, вы могли бы сделать что-то вроде:

all_pats = [...] 
combined_pat = r'|'.join(map(r'(?:{})'.format, all_pats)) 

поэтому любые регулярные выражения события остаются без сгруппированных, возможно, «кровотечение» по чередованию.

+0

Кажется, ваш ответ наиболее точно обращается к части Regex моего вопроса, но я запутался в ** pat2 **, поскольку я думал, что 'r ''' обрабатывает строку как необработанную, поэтому моя вкладка '\ t' сломается , Я здесь смущен? –

+1

'r '\ t'' и' '\ t'' работают одинаково по совпадению. Последний ищет буквенный байт, представляющий вкладку, первый ищет шаблон регулярного выражения '\ t', который, как это происходит, ищет вкладку. Это тот же конечный результат. Я просто OCD об использовании сырых строк; 'r '\ n'' и' r' \ t'' работают мелкие сырые или не сырые, но если вы ищете '' \ b'' вместо 'r '\ b'' (например) ищем ASCII backspace, а не границу слова, и вы почти никогда не хотели первого. – ShadowRanger

1

Вы» даже не используя регулярные выражения, так что вы можете просто провести цепочку replace:

s1 = "Please check with the store to confirm holiday hours." 
s2 = ''' Hours: 
      Monday: 9:30am - 6:00pm 
Tuesday: 9:30am - 6:00pm 
Wednesday: 9:30am - 6:00pm 
Thursday: 9:30am - 6:00pm 
Friday: 9:30am - 9:00pm 
Saturday: 9:30am - 6:00pm 
Sunday: 11:00am - 6:00pm 

Please check with the store to confirm holiday hours.''' 

strip2 = s2.replace(s1, "").replace("Hours:","").strip() 

print(strip2) 
+0

Ах, цепочки. Не думал об этом. Может ли 're.sub()' быть закованным в цепочку, тогда, когда я использую выражения, выражающие регулярные выражения? –

+1

@DavidMetcalfe Нет, потому что 're.sub' возвращает строку, которая не имеет' sub'. Вы могли бы их гнездиться, но это было бы ужасно быстро. – Jack

Смежные вопросы