2015-08-18 5 views
0

Рассматривайте У меня есть следующий текст: Temp:C5E501374D0343090957F7E5929E765C931F7D3EC7A96189FDA88549D54D9E4E5DB3FC1C2, adfsafd1242412,Использование Regex поймать текст до первого появления определенного символа

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

Я пробовал использовать regex Temp:(.+,) без успеха
Как я могу задать регулярное выражение, которое должно быть найдено первым ,?

ответ

3

Чтобы захватить значение вам нужно, вы можете попробовать и use lazy matching dot (.+? матчи 1 или более символов - но как можно меньше - это любые символы, но символ новой строки):

Temp:(.+?), 

С ленивым соответствия может съедают больше, чем нужно, а negated character class ([^,]+ матчи 1 или больше других, чем запятой символов) выглядит предпочтительнее:

Temp:([^,]+) 

результат фиксируется в 1-й группе с захвата гр oup (круглые скобки).

IDEONE sample code:

import re 
p = re.compile(r'Temp:([^,]+)') 
test_str = "Temp:C5E501374D0343090957F7E5929E765C931F7D3EC7A96189FDA88549D54D9E4E5DB3FC1C2, adfsafd1242412," 
print (re.search(p, test_str).group(1)) 

Выход: C5E501374D0343090957F7E5929E765C931F7D3EC7A96189FDA88549D54D9E4E5DB3FC1C2

ПРИМЕЧАНИЕ, что взгляд вокруг решение на основе более ресурсоемкой, что группа захвата один, что вы и я используем.

+1

Отрицательный класс символов - это правильный способ сделать это. Использование Lazy Quantifier в '. +' Может работать неправильно при определенных обстоятельствах. ('(. +?),' * может * совместить ',' с '.', если остальная часть шаблона может быть сопоставлена ​​только при этом -> Жадность Regex Engine) – dognose

1

Вы можете использовать регулярные выражения на основе просмотра назад:

(?<=Temp:)[^,]+ 

RegEx Demo

Код:

s='Temp:C5E501374D0343090957F7E5929E765C931F7D3EC7A96189FDA88549D54D9E4E5DB3FC1C2, adfsafd1242412,' 
print re.search(r"(?<=Temp:)[^,]+", s).group() 

Выход:

C5E501374D0343090957F7E5929E765C931F7D3EC7A96189FDA88549D54D9E4E5DB3FC1C2 
1

Чтобы использовать +, вам необходимо использовать знак ?. В противном случае все символы , также совпадают с частью регулярного выражения .+. В моем ответе я переместил , за пределы группы, так как из вашего описания я понял, что на самом деле вы этого не хотели в матче.

import re 
matcher = re.compile("Temp:(.+?),") 
matcher.match(a).group(1) 
+0

Не могли бы вы объяснить, почему вы используете компиляцию, а не' re.search' например? – JavaSa

+0

@JavaSa Я использовал компиляцию, чтобы получить RegexObject, который впоследствии может быть использован для сопоставления. Я склонен предположить, что регулярное выражение будет использоваться повторно. Теоретически объекты кэшируются внутренне re, и это не является требованием, но я предпочитаю явные решения из неявных, и я считаю, что RegexObjects более читабельны. – wojtossfm

0

Попробуйте следующее регулярное выражение: Temp:([^,]+,)

Теперь, после того, как что-нибудь Temp: не включается до первого ,.