Python 正则表达式选择性地包含分隔符

Python 正则表达式选择性地包含分隔符,python,regex,python-3.x,Python,Regex,Python 3.x,我想在两个正则表达式模式之间找到字符串。棘手的部分是“before模式”的部分需要包含在输出字符串中 这是我的代码的简化版本 重新导入 start|U模式=“(StartString1 | StartString2 | STARTSTRING3应包括在内| STARTSTRING4应包括在内)” end_pattern=“(EndString1 | EndString2)” 连接的模式=f'{start\u pattern}(?P.*?{end\u pattern}' input1=“…some

我想在两个正则表达式模式之间找到字符串。棘手的部分是“before模式”的部分需要包含在输出字符串中

这是我的代码的简化版本

重新导入
start|U模式=“(StartString1 | StartString2 | STARTSTRING3应包括在内| STARTSTRING4应包括在内)”
end_pattern=“(EndString1 | EndString2)”
连接的模式=f'{start\u pattern}(?P.*?{end\u pattern}'
input1=“…somejunk…开始字符串1内容结束字符串1…somejunk…”
输出=重新搜索(联合模式,输入1).group('content')
打印(输出)#打印我想要的“内容”
input2=“…某些垃圾邮件…开始字符串3应包括内容结束字符串2…某些垃圾邮件…”
输出=重新搜索(联合模式,输入2).group('content')
打印(输出)#打印“内容”,但我希望“开始字符串3应包括内容”

有没有办法更改这个正则表达式以获得我想要的输出?

您可以将应该包含的开始字符串设置为它们自己的命名组,并在匹配后加入两个命名组。由于应包含的起始字符串可能不匹配并成为
None
,因此在加入
内容组之前,可以使用
运算符将值默认为空字符串:

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'
重新导入
开始模式=“开始字符串1 |开始字符串2 |(?P开始字符串3应包括在内|开始字符串4应包括在内”)”
end_pattern=“(EndString1 | EndString2)”
连接的模式=f'{start\u pattern}(?P.*?{end\u pattern}'
input1=“…somejunk…开始字符串1内容结束字符串1…somejunk…”
匹配=重新搜索(联合模式,输入1)
输出=(match.group('start')或“”)+match.group('content'))
打印(输出)#打印我想要的“内容”
input2=“…某些垃圾邮件…开始字符串3应包括内容结束字符串2…某些垃圾邮件…”
匹配=重新搜索(联合模式,输入2)
输出=(match.group('start')或“”)+match.group('content'))
打印(输出)#打印“起始字符串3应包含在内容中”

只需按如下方式移动组名的位置:

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'                    

使用两个不同的正则表达式是一种选择吗?因为它似乎有助于找到一种更为可行的解决方案,任何一种捕获StartString 3和StartString 4的方法都应该包括在内,而不必为它们定义一个组?谢谢你的回答,希望对你有所帮助。我的例子不是已经做到了吗?注意
start
组如何同时包括startstring3和startstring4。您是正确的!我从代码的答案移植时没有注意到它。一切都很顺利