Я пытаюсь испачкать регулярное выражение.

Пример строки

Info:Somestring-103409115825.Call
Info: BIL*ONL*00003.Avbl

В настоящее время это соответствует

>>> print(re.search(r'Info:(.*?).Call', payload).group(1))
Somestring-103409115825

>>> print(re.search(r'Info:(.*?).Avbl', payload).group(1))
BIL*ONL*00003

Как сделать регулярное выражение таким, чтобы оно соответствовало обоим предположениям, например Info -- AnyString -- .Call|.Avbl?

0
Rahul Sharma 3 Фев 2021 в 09:38

2 ответа

Лучший ответ

Вы можете избежать точки и поместить ее перед использованием чередования для соответствия либо Call, либо Avbl

\bInfo:(.*?)\.(?:Call|Avbl)\b

Regex demo

import re
 
pattern = r"\bInfo:(.*?)\.(?:Call|Avbl)\b"
 
print(re.search(pattern, "Info:Somestring-103409115825.Call").group(1))
print(re.search(pattern, "Info: BIL*ONL*00003.Avbl").group(1))

Вывод

Somestring-103409115825
 BIL*ONL*00003

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

\bInfo:\s*(.*?)\.(?:Call|Avbl)\b

Посмотреть демонстрацию Python

2
The fourth bird 3 Фев 2021 в 10:15

Пожалуйста, попробуйте этот код.

import re

payload1 = 'Info:Somestring-103409115825.Call'
payload2 = 'Info: BIL*ONL*00003.Avbl'

print(re.search(r'Info:(.*?)((.Call)|(.Avbl))', payload1).group(1))
print(re.search(r'Info:(.*?)((.Call)|(.Avbl))', payload2).group(1))
1
Mr. Chip 3 Фев 2021 в 06:45
66022426