2012-03-26 5 views
0

я следующая строка з = «~ VERSION 11 11 11,1 222 22 22,222»Как совместить это регулярное выражение в python?

Я хочу, чтобы извлечь следующее в следующих переменных:

string Variable1 = "11 11 11.1" 
string Variable2 = "222 22 22.222" 

Как извлечь это с регулярным выражением? Или есть лучший альтернативный способ? (Примечание, Там может быть переменное расстояние в между лексем, которые я хочу, чтобы извлечь и ведущий персонаж может быть нечто иное, чем ~, но это, безусловно, будет символом:

например, могут быть:

~ VERSION 11 11 11.1 222 22 22.222 
$ VERSION 11 11 11.1  222 22 22.222 
@  VERSION 11 11 11.1   222 22 22.222 

Если регулярное выражение не имеет смысла для этого или, если есть лучший способ, пожалуйста, рекомендую. Как преформ экстракцию в этих двух переменных в Python?

+1

Откуда вы знаете, что '222' является началом второй переменной, а не' 22' или '11.1'? –

+0

@ KarlKnechtel: Я интерпретировал его как две группы из трех чисел (два целых числа и десятичные числа). Эти две переменные (ы), которые он хочет, имеют три поля по ширине. –

ответ

2

Попробуйте это:

import re 

test_lines = """ 
~ VERSION 11 11 11.1 222 22 22.222 
$ VERSION 11 11 11.1  222 22 22.222 
@  VERSION 11 11 11.1   222 22 22.222 
""" 

version_pattern = re.compile(r""" 
[[email protected]#$%^&*()]    # Starting symbol 
\s+       # Some amount of whitespace 
VERSION      # the specific word "VERSION" 
\s+       # Some amount of whitespace 
(\d+\s+\d+\s+\d+\.\d+)  # First capture group 
\s+       # Some amount of whitespace 
(\d+\s+\d+\s+\d+\.\d+)  # Second capture group 
""", re.VERBOSE) 

lines = test_lines.split('\n') 

for line in lines: 
    m = re.match(version_pattern, line) 
    if (m): 
     print (line) 
     print (m.groups()) 

, который дает выход:

~ VERSION 11 11 11.1 222 22 22.222 
('11 11 11.1', '222 22 22.222') 
$ VERSION 11 11 11.1  222 22 22.222 
('11 11 11.1', '222 22 22.222') 
@  VERSION 11 11 11.1   222 22 22.222 
('11 11 11.1', '222 22 22.222') 

Обратите внимание на использование подробных регулярных выражений с комментариями.

Чтобы преобразовать извлеченные номера версий в их числовое представление (т. Е. Int, float), используйте regexp в ответе @Preet Kukreti и конвертируйте с помощью int() или float(), как было предложено.

0
import re 
pattern_string = r"(\d+)\s+(\d+)\s+([\d\.]+)" #is the regex you are probably after 
m = re.match(pattern_string, "222 22 22.222") 
groups = None 
if m: 
    groups = m.groups() 
    # groups is ('222', '22', '22.222') 

, после чего вы можете использовать int() и float() для преобразования в примитивные числовые типы, если необходимо. Для производительным кода вы можете перекомпилировать регулярное выражение заранее с re.compile(...) и призывая match(...) или search(...) на результирующее скомпилированного объекта регулярных выражений

+0

Если вы делаете, чтобы определить шаблон отдельно ('pattern_string = r '....''), вы также можете его скомпилировать. –

0

Это определенно легко с регулярным выражением. Вот бы один из способов сделать это

>>> st="~ VERSION 11 11 11.1 222 22 22.222 333 33 33.3333" 
>>> re.findall(r"(\d+[ ]+\d+[ ]+\d+\.\d+)",st) 
['11 11 11.1', '222 22 22.222', '333 33 33.3333'] 

После того, как вы получите результат (ы) в списке, вы можете индексировать и получить отдельные строки.

1

Вы можете использовать метод split для String.

v1 = "~ VERSION 11 11 11.1 222 22 22.222" 
res_arr = v1.split(' ') # get ['~', 'VERSION', '11', '11', '11.1', '222', '22', '22.222'] 

а затем используйте элементы 2-4 и 5-7, как вы хотите.

+0

Ваш пример немного воинственный. 'v1.split()' даст '['11', '11', '11.1']'. –

+0

'str.split()' является самым быстрым (наиболее элегантным?) Решением, если вы можете * гарантировать *, что строка версии всегда будет иметь тот же формат. Регулярные выражения хороши, потому что вы можете проверить, что вся строка отформатирована так, как вы ожидаете, прежде чем вы начнете вытягивать биты и использовать их. –

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