Python 正则表达式可选捕获组或 lastindex
Python regex optional capture group or lastindex
我正在使用 python 逐行搜索文件中的部分和子部分。
*** Section with no sub section
*** Section with sub section ***
*** Sub Section ***
*** Another section
章节以 0-2 个空格开头,后跟三个星号,子章节有 2 个以上的空格,然后是星号。
我写出没有“***”的部分/子部分;目前(使用 re.sub)。
Section: Section with no sub section
Section: Section with sub section
Sub-Section: Sub Section
Section: Another Section
问题 1:是否有带捕获组的 python 正则表达式可以让我访问 section/sub 部分名称作为捕获组?
问题 2:正则表达式组如何允许我标识部分或子部分(可能基于 match.group 中 /content 的数量)?
示例(不工作):
match=re.compile('(group0 *** )(group1 section title)(group2 ***)')
sectionTitle = match.group(1)
if match.lastindex = 0: sectionType = section with no subs
if match.lastindex = 1: sectionType = section with subs
if match.lastindex = 2: sectionTpe = sub section
之前的尝试
我已经能够使用单独的正则表达式和 if 语句捕获部分或子部分,但我想一次完成所有操作。类似于下面的行;有第二组贪婪的麻烦。
'(^\*{3}\s)(.*)(\s\*{3}$)'
我似乎无法让贪婪或可选的组一起工作。 http://pythex.org/ 对这一点很有帮助。
此外,我尝试捕获星号“(*{3})”,然后根据找到的组数确定是部分还是子部分。
sectionRegex=re.compile('(\*{3})'
m=re.search(sectionRegex)
if m.lastindex == 0:
sectionName = re.sub(sectionRegex,'',line)
#Set a section flag
if m.lastindex ==1:
sectionName = re.sub(sectionRegex,''line)
#Set a sub section flag.
谢谢
也许我完全错了。感谢任何帮助。
最新更新
我一直在玩 Pythex、答案和其他研究。我现在花更多时间捕捉文字:
^[a-zA-Z]+$
并计算星号匹配的数量以确定 "level"。我仍在寻找一个正则表达式来匹配两个 - 三个 "groups"。可能不存在。
谢谢。
假设你的意思是小节有 3 个以上的空格,你可以这样做:
import re
data = '''
*** Section with no sub section
*** Section with sub section ***
*** Sub Section ***
*** Another section
'''
pattern = r'(?:(^ {0,2}\*{3}.*\*{3} *$)|(^ {0,2}\*{3}.*)|(^ *\*{3}.*\*{3} *$))'
regex = re.compile(pattern, re.M)
print regex.findall(data)
这将为您提供如下分组:
[('', ' *** Section with no sub section', ''),
('*** Section with sub section ***', '', ''),
('', '', ' *** Sub Section ***'),
('', ' *** Another section', '')]
正则表达式:
(^\s+)(\*{3})([a-zA-Z\s]+)(\*{3})*
如下所述捕获 3 或 4 个组。
Group 0: "(^\s+)" Captures whitespace
Group 1: "(\*{3})" captures '***'
Group 2:"([a-zA-Z\s]+)" captures alpha characters and spaces
Group 3: "(\*{3})*" captures 0 or or more occurrences of "***"
QUESTION 1: Is there a python regexp with capture groups that would
let me access the section/sub section names as a capture group?
a single regexp to match the two - three "groups". May not exist
是的,可以做到。我们可以将条件分解为下面的树:
- 行首 + 0到2个空格
- 2 个交替中的任何一个:
***
+ 任何文本[组 1]
- 1+空格 +
***
+ 任何文本[组 2]
***
(可选) + 行尾
上面的树可以用模式表示:
^[ ]{0,2}(?:[*]{3}(.*?)|[ ]+[*]{3}(.*?))(?:[*]{3})?$
请注意 部分 和 子部分 正在被不同的组捕获([组 1] 和 [第 2 组])。它们都使用相同的语法 .*?
,都带有 lazy quantifier (the extra "?") 以允许末尾的可选 "***"
匹配。
QUESTION 2: How would the regexp groups allow me to ID section
or sub section (possibly based on the number of /content in a match.group)?
上面的正则表达式仅在第 1 组中捕获 Sections,并且仅在第 2 组中捕获 Sub-Sections。为了更容易在代码中识别,我将使用 (?P<named> groups)
and retrieve the captures with .groupdict()
.
代码:
import re
data = """ *** Section with no sub section
*** Section with sub section ***
*** Sub Section ***
*** Another section"""
pattern = r'^[ ]{0,2}(?:[*]{3}[ ]?(?P<Section>.*?)|[ ]+[*]{3}[ ]?(?P<SubSection>.*?))(?:[ ]?[*]{3})?$'
regex = re.compile(pattern, re.M)
for match in regex.finditer(data):
print(match.groupdict())
''' OUTPUT:
{'Section': 'Section with no sub section', 'SubSection': None}
{'Section': 'Section with sub section', 'SubSection': None}
{'Section': None, 'SubSection': 'Sub Section'}
{'Section': 'Another section', 'SubSection': None}
'''
要引用每个 Section/Subsection,而不是打印 dict,您可以使用以下方法之一:
match.group("Section")
match.group(1)
match.group("SubSection")
match.group(2)
我正在使用 python 逐行搜索文件中的部分和子部分。
*** Section with no sub section
*** Section with sub section ***
*** Sub Section ***
*** Another section
章节以 0-2 个空格开头,后跟三个星号,子章节有 2 个以上的空格,然后是星号。
我写出没有“***”的部分/子部分;目前(使用 re.sub)。
Section: Section with no sub section
Section: Section with sub section
Sub-Section: Sub Section
Section: Another Section
问题 1:是否有带捕获组的 python 正则表达式可以让我访问 section/sub 部分名称作为捕获组?
问题 2:正则表达式组如何允许我标识部分或子部分(可能基于 match.group 中 /content 的数量)?
示例(不工作):
match=re.compile('(group0 *** )(group1 section title)(group2 ***)')
sectionTitle = match.group(1)
if match.lastindex = 0: sectionType = section with no subs
if match.lastindex = 1: sectionType = section with subs
if match.lastindex = 2: sectionTpe = sub section
之前的尝试 我已经能够使用单独的正则表达式和 if 语句捕获部分或子部分,但我想一次完成所有操作。类似于下面的行;有第二组贪婪的麻烦。
'(^\*{3}\s)(.*)(\s\*{3}$)'
我似乎无法让贪婪或可选的组一起工作。 http://pythex.org/ 对这一点很有帮助。
此外,我尝试捕获星号“(*{3})”,然后根据找到的组数确定是部分还是子部分。
sectionRegex=re.compile('(\*{3})'
m=re.search(sectionRegex)
if m.lastindex == 0:
sectionName = re.sub(sectionRegex,'',line)
#Set a section flag
if m.lastindex ==1:
sectionName = re.sub(sectionRegex,''line)
#Set a sub section flag.
谢谢 也许我完全错了。感谢任何帮助。
最新更新 我一直在玩 Pythex、答案和其他研究。我现在花更多时间捕捉文字:
^[a-zA-Z]+$
并计算星号匹配的数量以确定 "level"。我仍在寻找一个正则表达式来匹配两个 - 三个 "groups"。可能不存在。
谢谢。
假设你的意思是小节有 3 个以上的空格,你可以这样做:
import re
data = '''
*** Section with no sub section
*** Section with sub section ***
*** Sub Section ***
*** Another section
'''
pattern = r'(?:(^ {0,2}\*{3}.*\*{3} *$)|(^ {0,2}\*{3}.*)|(^ *\*{3}.*\*{3} *$))'
regex = re.compile(pattern, re.M)
print regex.findall(data)
这将为您提供如下分组:
[('', ' *** Section with no sub section', ''),
('*** Section with sub section ***', '', ''),
('', '', ' *** Sub Section ***'),
('', ' *** Another section', '')]
正则表达式:
(^\s+)(\*{3})([a-zA-Z\s]+)(\*{3})*
如下所述捕获 3 或 4 个组。
Group 0: "(^\s+)" Captures whitespace
Group 1: "(\*{3})" captures '***'
Group 2:"([a-zA-Z\s]+)" captures alpha characters and spaces
Group 3: "(\*{3})*" captures 0 or or more occurrences of "***"
QUESTION 1: Is there a python regexp with capture groups that would let me access the section/sub section names as a capture group?
a single regexp to match the two - three "groups". May not exist
是的,可以做到。我们可以将条件分解为下面的树:
- 行首 + 0到2个空格
- 2 个交替中的任何一个:
***
+ 任何文本[组 1]- 1+空格 +
***
+ 任何文本[组 2]
***
(可选) + 行尾
上面的树可以用模式表示:
^[ ]{0,2}(?:[*]{3}(.*?)|[ ]+[*]{3}(.*?))(?:[*]{3})?$
请注意 部分 和 子部分 正在被不同的组捕获([组 1] 和 [第 2 组])。它们都使用相同的语法 .*?
,都带有 lazy quantifier (the extra "?") 以允许末尾的可选 "***"
匹配。
QUESTION 2: How would the regexp groups allow me to ID section or sub section (possibly based on the number of /content in a match.group)?
上面的正则表达式仅在第 1 组中捕获 Sections,并且仅在第 2 组中捕获 Sub-Sections。为了更容易在代码中识别,我将使用 (?P<named> groups)
and retrieve the captures with .groupdict()
.
代码:
import re
data = """ *** Section with no sub section
*** Section with sub section ***
*** Sub Section ***
*** Another section"""
pattern = r'^[ ]{0,2}(?:[*]{3}[ ]?(?P<Section>.*?)|[ ]+[*]{3}[ ]?(?P<SubSection>.*?))(?:[ ]?[*]{3})?$'
regex = re.compile(pattern, re.M)
for match in regex.finditer(data):
print(match.groupdict())
''' OUTPUT:
{'Section': 'Section with no sub section', 'SubSection': None}
{'Section': 'Section with sub section', 'SubSection': None}
{'Section': None, 'SubSection': 'Sub Section'}
{'Section': 'Another section', 'SubSection': None}
'''
要引用每个 Section/Subsection,而不是打印 dict,您可以使用以下方法之一:
match.group("Section")
match.group(1)
match.group("SubSection")
match.group(2)