Regex выборочно включает разделитель - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу найти строки между двумя шаблонами регулярных выражений.Сложность состоит в том, что части «до шаблона» должны быть включены в выходную строку.

Вот упрощенная версия моего кода

import re
start_pattern = "( StartString1 | StartString2 | StartString3ShouldBeIncluded | StartString4ShouldBeIncluded )"
end_pattern = "( EndString1 | EndString2 )"
joined_pattern = f'{start_pattern}(?P<content>.*?){end_pattern}'

input1 = "...somejunk ... StartString1 THECONTENT EndString1 ...somejunk ... "
output = re.search(joined_pattern, input1).group('content')
print(output)  # Prints 'THECONTENT' which is what I want

input2 = "...somejunk ... StartString3ShouldBeIncluded THECONTENT EndString2 ...somejunk ..."
output = re.search(joined_pattern, input2).group('content')
print(output)  # Prints 'THECONTENT' but I want 'StartString3ShouldBeIncluded THECONTENT'

Есть ли способ изменить это регулярное выражение, чтобы получить желаемый результат?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Просто переместите название вашей группы следующим образом:

import re

start_pattern = "( StartString1 | StartString2 | StartString3ShouldBeIncluded | StartString4ShouldBeIncluded )"
end_pattern = "( EndString1 | EndString2 )"
joined_pattern = f'(?P<content>{start_pattern}.*?){end_pattern}'

input1 = "...somejunk ... StartString1 THECONTENT EndString1 ...somejunk ... "
output = re.search(joined_pattern, input1).group('content')
print(output)  # Prints 'THECONTENT' which is what I want

input2 = "...somejunk ... StartString3ShouldBeIncluded THECONTENT EndString2 ...somejunk ..."
output = re.search(joined_pattern, input2).group('content')
print(output)  # Prints 'StartString3ShouldBeIncluded THECONTENT'                    

Что печатает:

 StartString1 THECONTENT
 StartString3ShouldBeIncluded THECONTENT
0 голосов
/ 15 февраля 2019

Вы можете сделать стартовые строки, которые должны включать свою собственную именованную группу, и присоединиться к двум именованным группам после совпадения.Поскольку начальные строки, которые должны быть включены, могут не совпадать и стать None, вы можете использовать оператор or, чтобы установить значение по умолчанию для пустой строки перед объединением с группой content:

import re
start_pattern = "( StartString1 | StartString2 |(?P<start> StartString3ShouldBeIncluded | StartString4ShouldBeIncluded ))"
end_pattern = "( EndString1 | EndString2 )"
joined_pattern = f'{start_pattern}(?P<content>.*?){end_pattern}'

input1 = "...somejunk ... StartString1 THECONTENT EndString1 ...somejunk ... "
match = re.search(joined_pattern, input1)
output = (match.group('start') or '') + match.group('content')
print(output)  # Prints 'THECONTENT' which is what I want

input2 = "...somejunk ... StartString3ShouldBeIncluded THECONTENT EndString2 ...somejunk ..."
match = re.search(joined_pattern, input2)
output = (match.group('start') or '') + match.group('content')
print(output)  # Prints 'StartString3ShouldBeIncluded THECONTENT'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...