Как получить первый матч регулярного выражения в Python - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть строка: Data="a" Chain="Y" Classification="" Coreentity="N" createdAt="2018-05-05" name="DM_KING" Hour="23" Sub="N" Я хочу извлечь DM_KING

Я не знаю, как сопоставить первое вхождение " после последнего ", что после nameЯ написал код регулярного выражения следующим образом:

Data=.*name=\"

Я ожидаю, что код вернется DM_KING, DM_KING может иметь любую длину

Ответы [ 7 ]

0 голосов
/ 28 декабря 2018

Если вы хотите получить больше значений из входной строки, это было бы отличным местом для использования именованной группы :

import re
data = 'Data="a" Chain="Y" Classification="" Coreentity="N" createdAt="2018-05-05" name="DM_KING" Hour="23" Sub="N"'
matcher = re.compile('name="(?P<name>[^"]+)"')
match = matcher.search(data)
print(match.group('name'))

. Это печатает:

DM_KING

Объяснение :

  • name=" соответствует символам name=" буквально (с учетом регистра)
  • Именованная группа захвата "name" (?P<name>[^"]+)
  • Соответствует одному символу , а не (^), представленному в списке ["]
  • + Квантор - соответствует от одного до неограниченного временистолько раз, сколько возможно, возвращая по мере необходимости (жадный)
  • " соответствует символу " буквально
0 голосов
/ 28 декабря 2018

Вы можете использовать это регулярное выражение name="([^"]+)"

Это регулярное выражение ищет name=", затем группирует все найденное после этого, кроме ", и прекращает захват после того, как оно видит ".Затем вы можете распечатать все, что было захвачено в группе 1.

Код Python,

import re

str = 'Data="a" Chain="Y" Classification="" Coreentity="N" createdAt="2018-05-05" name="DM_KING" Hour="23" Sub="N"'
name = re.search(r'name="([^"]+)"', str)
print(name.group(1))

Печать,

DM_KING
0 голосов
/ 28 декабря 2018
print a[a.index('"',a.index('name="'))+1 :a.index('"',a.index('name="')+6)]

str.index (sub [, start [, end]]) возвращает индекс подстроки «sub» от позиции «start» до «end» в строке «str»

0 голосов
/ 28 декабря 2018

Попробуйте это регулярное выражение

[\s\S]*?name="([^"]*?)"
0 голосов
/ 28 декабря 2018

Если ваш До и после строки определен, т.е. Час, появляющийся после имени, Это должно работать как талисман для любой длины имени:

regex = r"name=\"(.*)\" Ho"
0 голосов
/ 28 декабря 2018
Data=.*name=\"([^"]*)

Вы можете использовать это с re.findall. См. Демонстрацию.

https://regex101.com/r/HrvZYo/1

0 голосов
/ 28 декабря 2018

Я считаю, что это должно работать:

re.search('name="\w+', s)[0].split("\"")[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...