如何检查命名捕获组是否存在?
How to check if named capture group exists?
我想知道测试命名捕获组是否存在的正确方法是什么。具体来说,我有一个将已编译的正则表达式作为参数的函数。正则表达式可能有也可能没有特定的命名组,命名组可能存在也可能不存在于传入的字符串中:
some_regex = re.compile("^foo(?P<idx>[0-9]*)?$")
other_regex = re.compile("^bar$")
def some_func(regex, string):
m = regex.match(regex, string)
if m.group("idx"): # get *** IndexError: no such group here...
print(f"index found and is {m.group('idx')}")
print(f"no index found")
some_func(other_regex, "bar")
我想在不使用 try
的情况下测试该组是否存在——因为这会短路函数的其余部分,如果命名组我仍然需要 运行没有找到。
如果要检查匹配数据对象是否包含命名组捕获,即如果命名组匹配,您可以使用 MatchData#groupdict()
属性:
import re
some_regex = re.compile("^foo(?P<idx>[0-9]*)?$")
match = some_regex.match('foo11')
print(match and 'idx' in match.groupdict()) # => True
match = some_regex.match('bar11')
print(match and 'idx' in match.groupdict()) # => None (coerceable to False)
见Python demo。请注意,如果您需要布尔值输出,只需将 print
中的表达式用 bool(...)
包装起来即可: print(bool(match and 'idx' in match.groupdict()))
.
如果需要检查编译模式中是否存在特定名称的组,可以使用Pattern.groupindex
检查组名是否存在:
def some_func(regex, group_name):
return group_name in regex.groupindex
文档说:
Pattern.groupindex
A dictionary mapping any symbolic group names defined by (?P<id>)
to group numbers. The dictionary is empty if no symbolic groups were used in the pattern.
参见 Python demo:
import re
some_regex = re.compile("^foo(?P<idx>[0-9]*)?$")
other_regex = re.compile("^bar$")
def some_func(regex, group_name):
return group_name in regex.groupindex
print(some_func(some_regex,"bar")) # => False
print(some_func(some_regex,"idx")) # => True
print(some_func(other_regex,"bar")) # => False
print(some_func(other_regex,"idx")) # => False
您可以查看 groupdict
of the match
object:
import re
some_regex = re.compile("^foo(?P<idx>[0-9]*)?$")
match = some_regex.match('foo11')
print(True) if match and 'idx' in match.groupdict() else print(False) # True
match = some_regex.match('bar11')
print(True) if match and 'idx' in match.groupdict() else print(False) # False
我想知道测试命名捕获组是否存在的正确方法是什么。具体来说,我有一个将已编译的正则表达式作为参数的函数。正则表达式可能有也可能没有特定的命名组,命名组可能存在也可能不存在于传入的字符串中:
some_regex = re.compile("^foo(?P<idx>[0-9]*)?$")
other_regex = re.compile("^bar$")
def some_func(regex, string):
m = regex.match(regex, string)
if m.group("idx"): # get *** IndexError: no such group here...
print(f"index found and is {m.group('idx')}")
print(f"no index found")
some_func(other_regex, "bar")
我想在不使用 try
的情况下测试该组是否存在——因为这会短路函数的其余部分,如果命名组我仍然需要 运行没有找到。
如果要检查匹配数据对象是否包含命名组捕获,即如果命名组匹配,您可以使用 MatchData#groupdict()
属性:
import re
some_regex = re.compile("^foo(?P<idx>[0-9]*)?$")
match = some_regex.match('foo11')
print(match and 'idx' in match.groupdict()) # => True
match = some_regex.match('bar11')
print(match and 'idx' in match.groupdict()) # => None (coerceable to False)
见Python demo。请注意,如果您需要布尔值输出,只需将 print
中的表达式用 bool(...)
包装起来即可: print(bool(match and 'idx' in match.groupdict()))
.
如果需要检查编译模式中是否存在特定名称的组,可以使用Pattern.groupindex
检查组名是否存在:
def some_func(regex, group_name):
return group_name in regex.groupindex
文档说:
Pattern.groupindex
A dictionary mapping any symbolic group names defined by(?P<id>)
to group numbers. The dictionary is empty if no symbolic groups were used in the pattern.
参见 Python demo:
import re
some_regex = re.compile("^foo(?P<idx>[0-9]*)?$")
other_regex = re.compile("^bar$")
def some_func(regex, group_name):
return group_name in regex.groupindex
print(some_func(some_regex,"bar")) # => False
print(some_func(some_regex,"idx")) # => True
print(some_func(other_regex,"bar")) # => False
print(some_func(other_regex,"idx")) # => False
您可以查看 groupdict
of the match
object:
import re
some_regex = re.compile("^foo(?P<idx>[0-9]*)?$")
match = some_regex.match('foo11')
print(True) if match and 'idx' in match.groupdict() else print(False) # True
match = some_regex.match('bar11')
print(True) if match and 'idx' in match.groupdict() else print(False) # False