字符串的正则表达式模式 - python
Regex pattern for string - python
我想以这种格式对字符串进行分组:
Some_text Some_text 1 2 3
BEGIN Some_text Some_text
44 76 1321
Some_text Some_text
END Some_text
Some_Text Some_text 1 4 5
我想把它从 BEGIN 到 END 分组,像这样:
Some_text Some_text 1 2 3
<!-- START -->
BEGIN Some_text Some_text
44 76 1321
Some_text Some_text
END <!-- END --> Some_text
Some_Text Some_text 1 4 5
<!-- START -->
和 <!-- END -->
- 这只是对分组开始和结束的注释。
我只想获取 BEGIN 和 END
之间的文本
我有类似的东西,但它并不适用于所有情况 - 当有大量数据时,它就不起作用:
reg = re.compile(rf"{begin}[\-\s]+(.*)\n{end}", re.DOTALL)
core = re.search(reg, text).group(1)
lines = core.split("\n")
text 是我的字符串,然后在分组后我将它交换为一个列表 - 我不知道如何直接从列表中制作这个正则表达式,那么我就不会在字符串文本上执行此操作,但在 python 列表文本
上执行
给我一些提示或帮助我如何解决它。
示例代码:
import re
text="Some_text Some_text 1 2 3\nBEGIN Some_text Some_text\n44 76 1321\nSome_text Some_text\nEND Some_text\nSome_Text Some_text 1 4 5"
begin = "BEGIN"
end = "END"
reg = re.compile(rf"{begin}[\-\s]+(.*)\n{end}", re.DOTALL)
core = re.search(reg, text).group(1)
lines = core.split("\n")
print(lines)
它可以工作,但我不知道为什么有时它不工作,当它需要大量文本时,例如:20k 字
我只想获取 BEGIN 和 END
之间的文本
这个有效:
txt='''\
Some_text Some_text 1 2 3
BEGIN Some_text Some_text
44 76 1321
Some_text Some_text
END Some_text
Some_Text Some_text 1 4 5'''
import re
print(re.sub(r'(?=BEGIN )(.*END)',r'<!-- START -->\n <!-- END -->',txt,flags=re.S))
或者,
print(re.sub(r'(?=^BEGIN )([\s\S]*END)',r'<!-- START -->\n <!-- END -->',txt, flags=re.M))
要么打印:
Some_text Some_text 1 2 3
<!-- START -->
BEGIN Some_text Some_text
44 76 1321
Some_text Some_text
END <!-- END --> Some_text
Some_Text Some_text 1 4 5
这使用非贪婪模式来匹配从开始标记到结束标记的所有内容,包括标记。正则表达式模式中的 \b
s 是为了确保 BEGIN 和 END 不是较长单词的一部分,例如,因此 "BEGIN" 不会匹配 "BEGINS" 或 "BEGINNING".注意:对于带有不匹配标记的输入,它可能无法正常工作,例如 "a b c BEGIN d e BEGIN 1 2 END 3"(两个 BEGIN)。
import re
txt='''\
Some_text Some_text 1 2 3
BEGIN Some_text Some_text
44 76 1321
Some_text Some_text
END Some_text
Some_Text Some_text 1 4 5'''
begin = 'BEGIN'
end = 'END'
regex = re.compile(rf"(?<=\b{begin}\b)(.*?)(?=\b{end}\b)", flags=re.DOTALL)
match = regex.search(txt)
if match:
print(match[1])
你可能会用到
^BEGIN\b(.*(?:\r?\n(?!(?:BEGIN|END)\b).*)*)\r?\nEND
如果要包含BEGIN和END,可以省略捕获组
^BEGIN\b.*(?:\r?\n(?!(?:BEGIN|END)\b).*)*\r?\nEND
代码示例
import re
regex = r"^BEGIN\b(.*(?:\r?\n(?!(?:BEGIN|END)\b).*)*)\r?\nEND"
test_str = ("Some_text Some_text 1 2 3\n"
"BEGIN Some_text Some_text\n"
"44 76 1321\n"
"Some_text Some_text\n"
"END Some_text\n"
"Some_Text Some_text 1 4 5\n")
print(re.findall(regex, test_str, re.MULTILINE))
输出
[' Some_text Some_text\n44 76 1321\nSome_text Some_text']
我想以这种格式对字符串进行分组:
Some_text Some_text 1 2 3
BEGIN Some_text Some_text
44 76 1321
Some_text Some_text
END Some_text
Some_Text Some_text 1 4 5
我想把它从 BEGIN 到 END 分组,像这样:
Some_text Some_text 1 2 3
<!-- START -->
BEGIN Some_text Some_text
44 76 1321
Some_text Some_text
END <!-- END --> Some_text
Some_Text Some_text 1 4 5
<!-- START -->
和 <!-- END -->
- 这只是对分组开始和结束的注释。
我只想获取 BEGIN 和 END
我有类似的东西,但它并不适用于所有情况 - 当有大量数据时,它就不起作用:
reg = re.compile(rf"{begin}[\-\s]+(.*)\n{end}", re.DOTALL)
core = re.search(reg, text).group(1)
lines = core.split("\n")
text 是我的字符串,然后在分组后我将它交换为一个列表 - 我不知道如何直接从列表中制作这个正则表达式,那么我就不会在字符串文本上执行此操作,但在 python 列表文本
上执行给我一些提示或帮助我如何解决它。
示例代码:
import re
text="Some_text Some_text 1 2 3\nBEGIN Some_text Some_text\n44 76 1321\nSome_text Some_text\nEND Some_text\nSome_Text Some_text 1 4 5"
begin = "BEGIN"
end = "END"
reg = re.compile(rf"{begin}[\-\s]+(.*)\n{end}", re.DOTALL)
core = re.search(reg, text).group(1)
lines = core.split("\n")
print(lines)
它可以工作,但我不知道为什么有时它不工作,当它需要大量文本时,例如:20k 字 我只想获取 BEGIN 和 END
之间的文本这个有效:
txt='''\
Some_text Some_text 1 2 3
BEGIN Some_text Some_text
44 76 1321
Some_text Some_text
END Some_text
Some_Text Some_text 1 4 5'''
import re
print(re.sub(r'(?=BEGIN )(.*END)',r'<!-- START -->\n <!-- END -->',txt,flags=re.S))
或者,
print(re.sub(r'(?=^BEGIN )([\s\S]*END)',r'<!-- START -->\n <!-- END -->',txt, flags=re.M))
要么打印:
Some_text Some_text 1 2 3
<!-- START -->
BEGIN Some_text Some_text
44 76 1321
Some_text Some_text
END <!-- END --> Some_text
Some_Text Some_text 1 4 5
这使用非贪婪模式来匹配从开始标记到结束标记的所有内容,包括标记。正则表达式模式中的 \b
s 是为了确保 BEGIN 和 END 不是较长单词的一部分,例如,因此 "BEGIN" 不会匹配 "BEGINS" 或 "BEGINNING".注意:对于带有不匹配标记的输入,它可能无法正常工作,例如 "a b c BEGIN d e BEGIN 1 2 END 3"(两个 BEGIN)。
import re
txt='''\
Some_text Some_text 1 2 3
BEGIN Some_text Some_text
44 76 1321
Some_text Some_text
END Some_text
Some_Text Some_text 1 4 5'''
begin = 'BEGIN'
end = 'END'
regex = re.compile(rf"(?<=\b{begin}\b)(.*?)(?=\b{end}\b)", flags=re.DOTALL)
match = regex.search(txt)
if match:
print(match[1])
你可能会用到
^BEGIN\b(.*(?:\r?\n(?!(?:BEGIN|END)\b).*)*)\r?\nEND
如果要包含BEGIN和END,可以省略捕获组
^BEGIN\b.*(?:\r?\n(?!(?:BEGIN|END)\b).*)*\r?\nEND
代码示例
import re
regex = r"^BEGIN\b(.*(?:\r?\n(?!(?:BEGIN|END)\b).*)*)\r?\nEND"
test_str = ("Some_text Some_text 1 2 3\n"
"BEGIN Some_text Some_text\n"
"44 76 1321\n"
"Some_text Some_text\n"
"END Some_text\n"
"Some_Text Some_text 1 4 5\n")
print(re.findall(regex, test_str, re.MULTILINE))
输出
[' Some_text Some_text\n44 76 1321\nSome_text Some_text']