2015-12-29 2 views
0

У меня есть структура выглядит журналRegex Как соответствовать Empty

a b c| 

так, например:

Mozilla 5.0 white| 

должны быть согласованы/извлечены STH как

a: Mozilla, b: 5.0, c: white 

но есть запись в моем журнале:

iOS |

, которые могут быть объяснены как

a:iOS, b:null, c:null 

Я использую python3 повторно, делая матч с именем группы? P

есть ли способ для достижения этой цели?

+0

" следует сопоставить с тем, как [..] "?! Я совершенно смущен. Можете ли вы сделать один или два конкретных примера со входом и ожидаемыми совпадениями/группами соответствия? – timgeb

+0

... и с регулярным выражением, которое вы используете ... – barny

ответ

2
>>> m = re.match(r"(?P<a>[^\s]+)(\s+(?P<b>[^\s]+))?(\s+(?P<c>[^\s]+))?\s*\|") 

>>> m.groups() 
('iOS', None, None) 
>>> m.groupdict() 
{'c': None, 'a': 'iOS', 'b': None} 

>>> m = re.match(r"(?P<a>[^\s]+)(\s+(?P<b>[^\s]+))?(\s+(?P<c>[^\s]+))?\s*\|") 

>>> m.groups() 
('Mozilla', ' 5.0', ' white') 
>>> m.groupdict() 
{'c': 'white', 'a': 'Mozilla', 'b': '5.0'} 

UPDATE:

Я заметил, что в предыдущей версии включены пробелы в возвращенных группах - я факторизуется \ s + в (P <> ...?), Чтобы сохранить пару байтов , но у этого был побочный эффект. Поэтому я исправил это и также сделал его терпимым к пространству перед финальным '|'

2

Вы можете поместить свои модели в списке, как следующие:

>>> pattern = ['a', 'b', 'c'] 

Затем с помощью re.findall() найти все относительные части, а затем использовать zip и dict создать относительный словарь:

>>> s = "IOS|" 
>>> dict(zip(pattern,re.findall('([^\s]+)?\s?([^\s]+)?\s?([^\s]+)?\|',s)[0])) 
{'a': 'IOS', 'c': '', 'b': ''} 
>>> 
>>> s = "Mozilla 5.0 white|" 
>>> 
>>> dict(zip(pattern,re.findall('([^\s]+)?\s?([^\s]+)?\s?([^\s]+)?\|',s)[0])) 
{'a': 'Mozilla', 'c': 'white', 'b': '5.0'} 
Смежные вопросы