2016-02-06 2 views
1

У меня есть текстовый файл, который есть мульти строки в одной и той же следующей схемеPython re.findall получает значение

Server:x.x.x # U:100 # P:100 # Pre:00 # Tel:xxxxxx 

Я построил этот код, чтобы получить значение после предварительного:

x2 = (re.findall(r'Pre:(\d+)',s)) 

Я m, не очень знакомый с re-образцами, но этот код не получает значение, если оно равно + или пустое значение (значение a None)

Любые предложения по генерации кода для получения того, что значение после Pre: до следующий # без пробела?

+0

Вы показали нам только пример, который работает _does_. Вы должны показать нам примеры, которые не работают. Что именно вы имеете в виду «+ или пустое значение»? –

ответ

1

Как насчет этого шаблона? Он получит все до следующего " #", но не будет жадным (вот для чего ?).

r"Pre:(.*?) #" 
0

пример вы предоставили работу просто отлично:

>>> import re 
>>> s = 'Server:x.x.x # U:100 # P:100 # Pre:00 # Tel:xxxxxx' 
>>> re.findall(r'Pre:(\d+)', s) 
['00'] 

Вам может понадобиться добавить обработку в +/- и ., для отрицательных чисел и десятичных дробей: (-?[\d.,]+).

Если вам нужно сопоставить любую строку (а не просто цифры), вы можете использовать Pre:(.*?)\s*#.

Или вы можете избежать использования регулярных выражений на всех и раздельным ряд по # сепаратора:

>>> s.split('#') 
['Server:x.x.x ', ' U:100 ', ' P:100 ', ' Pre:00 ', ' Tel:xxxxxx'] 

И затем разделить строки на первый ::

>>> for row in s.split('#'): 
...  k, v = row.split(':', 1) 
...  print(k.strip(), '=', v.strip()) 
... 
Server = x.x.x 
U = 100 
P = 100 
Pre = 00 
Tel = xxxxxx 
0

без регулярных выражений подход будет включать разделение на #, а затем на : формирование словаря, который облегчил бы доступ к частям строки:

>>> s = "Server:x.x.x # U:100 # P:100 # Pre:00 # Tel:xxxxxx" 
>>> d = dict([key.split(":") for key in s.split(" # ")]) 
>>> d["Pre"] 
'00' 
0
x2 = (re.findall(r'Pre:(.*?) #',s)) 

Pre:(.*?) # 

Match символьная строка «Pre:» буквально «Pre:» Сопоставьте регулярное выражение ниже и захватить его матч в число «1 обратная ссылка (. ?)
Соответствует любому символу, который не является символом прерывания строки «.
? » между нулем и неограниченное количество раз, а несколько раз, как это возможно, расширяющихся по мере необходимости (ленивые)«*?»
Match строка символов„#“ буквально«#»