忽略正则表达式中不相关的部分
Ignoring irrelevant section in regex
我有以下文字:(这与 密切相关但不相似)
text = '7\n\x0c\n7.\tA B C\n\n7.1\tbla bla bla .\n\n7.2\tanother bla bla \n\n7.3\tand another one.\n\n8.\tX Y Z\n\n8.1\tha ha ha \n\n(a)\thohoho ;\n\n(b)\thihihi,\n\n8'
我希望 select 第 7 节只得到:
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.
我也是:
print(re.findall(r'^\d+\.\s*A B C[^\S\n]*(?:\n\n.+)*', text, re.M)[0])
给出:
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.
8. X Y Z
8.1 ha ha ha
(a) hohoho ;
(b) hihihi,
8
如您所见,8
在 8.1
之后。所以这似乎让正则表达式感到困惑,我想知道在这种情况下我能做什么?
请注意,部分的数量通常会有所不同,所以我不能做类似的事情
re.findall(r'^7\..*', text, re.MULTILINE)
(即A B C可以放在其他section中)
您可以使用
^(\d+\.)\s*A B C(?:\s*\n\b.*)*
^
字符串开头
(\d+\.)\s*A B C
捕获第1组匹配1+个数字和.
,然后匹配A B C
(?:
非捕获组整体匹配
\s*\n
匹配可选的空白字符和换行符
\b
对组 1 的反向引用后跟单词边界
.*
匹配行的其余部分
)*
关闭非捕获组并选择性重复
看到一个regex demo.
import re
text = '7\n\x0c\n7.\tA B C\n\n7.1\tbla bla bla .\n\n7.2\tanother bla bla \n\n7.3\tand another one.\n\n8.\tX Y Z\n\n8.1\tha ha ha \n\n(a)\thohoho ;\n\n(b)\thihihi,\n\n8'
pattern = r"^(\d+\.)\s*A B C(?:\s*\n\b.*)*"
m = re.search(pattern, text, re.MULTILINE)
if m:
print(m.group())
输出
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.
这是找到 7.
和第一个 8.
之间的线的潜在解决方案:
m = re.search(r'^7\.\s*(?:.|\n)+?(?=\n8\.)', text, re.MULTILINE)
print(m.group() if m else None)
输出:
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.
我有以下文字:(这与
text = '7\n\x0c\n7.\tA B C\n\n7.1\tbla bla bla .\n\n7.2\tanother bla bla \n\n7.3\tand another one.\n\n8.\tX Y Z\n\n8.1\tha ha ha \n\n(a)\thohoho ;\n\n(b)\thihihi,\n\n8'
我希望 select 第 7 节只得到:
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.
我也是:
print(re.findall(r'^\d+\.\s*A B C[^\S\n]*(?:\n\n.+)*', text, re.M)[0])
给出:
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.
8. X Y Z
8.1 ha ha ha
(a) hohoho ;
(b) hihihi,
8
如您所见,8
在 8.1
之后。所以这似乎让正则表达式感到困惑,我想知道在这种情况下我能做什么?
请注意,部分的数量通常会有所不同,所以我不能做类似的事情
re.findall(r'^7\..*', text, re.MULTILINE)
(即A B C可以放在其他section中)
您可以使用
^(\d+\.)\s*A B C(?:\s*\n\b.*)*
^
字符串开头(\d+\.)\s*A B C
捕获第1组匹配1+个数字和.
,然后匹配A B C
(?:
非捕获组整体匹配\s*\n
匹配可选的空白字符和换行符\b
对组 1 的反向引用后跟单词边界.*
匹配行的其余部分
)*
关闭非捕获组并选择性重复
看到一个regex demo.
import re
text = '7\n\x0c\n7.\tA B C\n\n7.1\tbla bla bla .\n\n7.2\tanother bla bla \n\n7.3\tand another one.\n\n8.\tX Y Z\n\n8.1\tha ha ha \n\n(a)\thohoho ;\n\n(b)\thihihi,\n\n8'
pattern = r"^(\d+\.)\s*A B C(?:\s*\n\b.*)*"
m = re.search(pattern, text, re.MULTILINE)
if m:
print(m.group())
输出
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.
这是找到 7.
和第一个 8.
之间的线的潜在解决方案:
m = re.search(r'^7\.\s*(?:.|\n)+?(?=\n8\.)', text, re.MULTILINE)
print(m.group() if m else None)
输出:
7. A B C
7.1 bla bla bla .
7.2 another bla bla
7.3 and another one.