分組
分組是用括號完成的。呼叫 group()
將返回由匹配的帶括號的子組形成的字串。
match.group() # Group without argument returns the entire match found
# Out: '123'
match.group(0) # Specifying 0 gives the same result as specifying no argument
# Out: '123'
也可以向 group()
提供引數以獲取特定子組。
來自文件 :
如果只有一個引數,則結果為單個字串; 如果有多個引數,則結果是一個元組,每個引數有一個專案。
另一方面,呼叫 groups()
會返回包含子組的元組列表。
sentence = "This is a phone number 672-123-456-9910"
pattern = r".*(phone).*?([\d-]+)"
match = re.match(pattern, sentence)
match.groups() # The entire match as a list of tuples of the paranthesized subgroups
# Out: ('phone', '672-123-456-9910')
m.group() # The entire match as a string
# Out: 'This is a phone number 672-123-456-9910'
m.group(0) # The entire match as a string
# Out: 'This is a phone number 672-123-456-9910'
m.group(1) # The first parenthesized subgroup.
# Out: 'phone'
m.group(2) # The second parenthesized subgroup.
# Out: '672-123-456-9910'
m.group(1, 2) # Multiple arguments give us a tuple.
# Out: ('phone', '672-123-456-9910')
命名組
match = re.search(r'My name is (?P<name>[A-Za-z ]+)', 'My name is John Smith')
match.group('name')
# Out: 'John Smith'
match.group(1)
# Out: 'John Smith'
建立可以按名稱和索引引用的捕獲組。
非捕獲組
使用 (?:)
會建立一個組,但不會捕獲該組。這意味著你可以將其用作組,但不會汙染你的組空間。
re.match(r'(\d+)(\+(\d+))?', '11+22').groups()
# Out: ('11', '+22', '22')
re.match(r'(\d+)(?:\+(\d+))?', '11+22').groups()
# Out: ('11', '22')
此示例匹配 11+22
或 11
,但不匹配 11+
。這是因為+
標誌和第二個術語被分組。另一方面,未捕獲+
標誌。