Регулярное выражение Python извлечь строку между двумя строками - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть строка, показывающая как

text = "isLogIn=true; Max-Age=400; Path=/; Expires=Wed, 25 Sep 2019 17:46:30 GMT, value=qasde% , client=retail"

Мне нужно извлечь строку, показывающую значение, т.е. qasde%.Я использую скрипты Python

То, что я пробовал, было

text = text.split('value', 1)[1]
text = text.split('client',1)[0]

Это дает мне правильное значение, но есть ли простой способ добиться этого?

Ответы [ 3 ]

2 голосов
/ 24 сентября 2019

https://regex101.com/r/u9gpm5/2

import re

text = 'isLogIn=true; Max-Age=400; Path=/; Expires=Wed, 25 Sep 2019 17:46:30 GMT, value=qasde% , client=retail'

m = re.search('value=(.+?) , client=', text)
if m:
    found = m.group(1)

Кредиты https://stackoverflow.com/a/4667014/11063448

1 голос
/ 24 сентября 2019

Это выражение может просто возвращать, что:

import re

expression = r'(?:value|client)\s*=\s*([^,\r\n]*?)(?=\s*,|$)'

string = """
isLogIn=true; Max-Age=400; Path=/; Expires=Wed, 25 Sep 2019 17:46:30 GMT, value=qasde% , client=retail

"""

print(re.findall(expression, string, re.M))

Вывод

['qasde%', 'retail']

Если вы хотите упростить / изменить / исследовать выражение, оно было объяснено сверхуправая панель regex101.com .Если хотите, вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами входных данных.


RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

1 голос
/ 24 сентября 2019

Вы не предоставили достаточно информации, чтобы полностью ответить на вопрос.Значение всегда появляется перед клиентом?Всегда ли он появляется после даты и времени?

В любом случае - этот ответ или Ответ Quicksilver должен работать, если значение всегда появляется после даты и времени и перед клиентом,

Однако вы также можете просто искать то, что появляется после value= и до ,, и в этом случае это должно работать: https://regex101.com/r/a4d7Bx/1

import re

text = 'isLogIn=true; Max-Age=400; Path=/; Expires=Wed, 25 Sep 2019 17:46:30 GMT, value=qasde% , client=retail'

m = re.search('value=(.+?) ,', text)
if m:
    found = m.group(1)
    print(found)

Другой способсделайте это, слегка отредактировав код:

text = 'isLogIn=true; Max-Age=400; Path=/; Expires=Wed, 25 Sep 2019 17:46:30 GMT, value=qasde% , client=retail'

text = text.split('value=', 1)[1]
text = text.split(' , client',1)[0]
print(text)

Вы просили более простой способ.Возможно, оба эти метода довольно просты, поэтому я бы выбрал более быстрый (если вы не хотите более общего решения, в этом случае используйте первый вариант).Я рассчитал их, используя следующий код:

import re
import cProfile

text = 'isLogIn=true; Max-Age=400; Path=/; Expires=Wed, 25 Sep 2019 17:46:30 GMT, value=qasde% , client=retail'

def option1(text):
  for i in range(10000):
    re.search('value=(.+?) ,', text)

def option2(text):
  for i in range(10000):
    temp = text.split('value=', 1)[1]
    temp = temp.split(' , client',1)[0]

cProfile.run("option1(text)")
print("\n\n\n\n\n")
cProfile.run("option2(text)")

И первый вариант занял 0,076 секунды, а второй - 0,027 секунды, поэтому более быстрый вариант использует split.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...