2016-12-05 2 views
0

Я пишу сценарий Python, чтобы найти имя тега в строку, как это:питон RE белого пространства в шаблоне

string='Tag Name =LIC100 State =TRUE'

Если использовать выражение как этот

re.search('Name(.*)State',string)

Я получаю «= LIC100». Я бы хотел получить только LIC100.

Любые предложения по настройке шаблона для устранения пробелов и равного сигнала?

ответ

0

Следуя советам выше, мне удалось найти хорошее решение. На самом деле, в строке, которую я пытаюсь обработать, есть некоторые непечатаемые символы. Это как этот

"Tag Name\x00=LIC100\x00\tState=TRUE" 

Используя концепцию опережающего просмотра и просмотра назад я нашел следующее решение:

import re 
s = 'Tag Name\x00=LIC100\x00\tState=TRUE' 
T=re.search(r'(?<=Name\x00=)(.*)(?=\x00\tState)',s) 
print(T.group(0)) 

Хорошая вещь об этом является то, что результат не имеет непечатаемую характер на нем ,

<_sre.SRE_Match object; span=(10, 16), match='LIC100'> 
1

Это потому, что вы получаете символы 0+, кроме символов разрыва строки, от Name до последних State. Вы можете ограничить шаблон в 1-й группе, чтобы только не-непечатаемых:

import re 
string='Tag Name =LIC100 State =TRUE' 
m = re.search(r'Name\s*=(\S*)',string) 
if m: 
    print(m.group(1)) 

См детализирует Python demo

Pattern:

  • Name - буквальный символ последовательности
  • \s* - 0+ пробелы
  • = - буква =
  • (\S*) - Группа 1, фиксирующая символы 0+, отличные от пробелов (или \S+, может использоваться для сопоставления 1 или более символов, кроме пробелов).
0

Самым простым решением было бы, вероятно, просто лишить его постфактум, например, так:

s = " =LIC100 " 
s = s.strip('= ') 
print(s) 
#LIC100 

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

reg = r'Name[ =]+([A-Za-z0-9]+)\s+State' 
0

Ваше текущее регулярное выражение не срабатывает, потому что (.*) захватывает все символы до появления State. Вместо того, чтобы захватывать все, вы можете использовать положительный lookbehind, чтобы описать, что предшествует, но не входит в контент, который вы действительно хотите захватить. В этом случае, «Name =» предшествует матч, так что мы можем вставить его в 'назад утверждение как (?<=Name =), а затем продолжить, чтобы захватить все до следующего пробела:

>>> import re 
>>> s = 'Tag Name =LIC100 State =TRUE' 
>>> r = re.compile("(?<=Name =)\w*") 
>>> print(r.search(s)) 
<_sre.SRE_Match object; span=(10, 16), match='LIC100'> 
>>> print(r.search(s).group(0)) 
LIC100 
+0

Thanks skrrgwasme. Это очень помогает мне. – Dariva

+0

Я понял, что строка, которую я обрабатываю, имеет некоторые символы, не подлежащие печати. Строка похожа на 'Имя тега \ x00 = LIC100 \ x00 \ tState = TRUE'. Я попытался использовать «T = re.search (r '(? <= Name \ x00 =) \ x00 *', s)", но он возвращает объект <_sre.SRE_Match; span = (10, 10), match = ''> – Dariva

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