Как получить группу элементов в несколько строк в регулярном выражении - PullRequest
0 голосов
/ 02 мая 2020

Пример:

Online ID:JohnDoe
[+] Country: FR
=========================================
---Played at 2020-05-02 4:00PM
---Played at 2020-03-02 3:00PM
---Played at 2020-01-02 2:00PM
---Played at 2020-01-02 1:00PM
=========================================

Я хочу иметь возможность получить сетевой идентификатор и все случаи, когда пользователь играл. В настоящее время у меня есть

(.*)\sOnline ID:(.*)\s.*\s.*\s.*

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

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Регулярное выражение действительно не требуется для этого. Но если нужно, нет необходимости делать это слишком сложным.

Попробуйте:

import re

text = """
Online ID:JohnDoe
[+] Country: FR
=========================================
---Played at 2020-05-02 4:00PM
---Played at 2020-03-02 3:00PM
---Played at 2020-01-02 2:00PM
---Played at 2020-01-02 1:00PM
========================================="""

l = re.findall(r'(?:Online ID:|Played at )(.*)', text)
print(l)

Отпечатки:

['JohnDoe', '2020-05-02 4:00PM', '2020-03-02 3:00PM', '2020-01-02 2:00PM', '2020-01-02 1:00PM']

Объяснение:

(?:             # start of a non-capture group)
   Online ID:   #  match "Online ID:"
   |            # or
   Played at    # match "Played at "
)               # end of non-capture group
(.*)            # match everything up to but not including the end of line in capture group 1

См. Regex Demo

0 голосов
/ 02 мая 2020

Вы можете использовать следующее:

In [1]: import re

In [2]: k = r'(?sm)(?:^Online ID:(\w+)$)|(?:^---Played at ([0-9]{4,}-[0-9]{2,}-[0-9]{2,} [0-9]{1,2}:[0-9]{2,}[A|P]M$))'

In [3]: data="""Online ID:JohnDoe
   ...: [+] Country: FR
   ...: =========================================
   ...: ---Played at 2020-05-02 4:00PM
   ...: ---Played at 2020-03-02 3:00PM
   ...: ---Played at 2020-01-02 2:00PM
   ...: ---Played at 2020-01-02 1:00PM
   ...: ========================================="""

In [15]: re.findall(k, data, re.MULTILINE)
Out[15]:
[('JohnDoe', ''),
 ('', '2020-05-02 4:00PM'),
 ('', '2020-03-02 3:00PM'),
 ('', '2020-01-02 2:00PM'),
 ('', '2020-01-02 1:00PM')]

Здесь s и m включает:

  • s модификатор: одна строка. Точка соответствует символам новой строки
  • m модификатор: многострочный. Заставляет ^ и $ сопоставлять начало / конец каждой строки (не только начало / конец строки)

, а затем две важные для вас группы:

  • (?:^Online ID:(\w+)$) чтобы найти идентификатор пользователя
  • ^---Played at ([0-9]{4,}-[0-9]{2,}-[0-9]{2,} [0-9]{1,2}:[0-9]{2,}[A|P]M$) чтобы найти время игры
...