Python正则表达式中圆括号是一个常用的工具,它可以提高正则表达式匹配的精度,也可以让正则表达式更加有效。本文将从多个方面,详细阐述Python正则表达式中圆括号的应用。
一、提取匹配的子串
在Python正则表达式中,圆括号可以用来分组,当匹配成功后,可以用group()方法提取其中的子串。
import re
text = "hello world"
pattern = "(w+) (w+)"
result = re.match(pattern, text)
print(result.groups()) # ("hello", "world")
上述代码中,pattern使用圆括号将w+分组,当匹配成功后,group()方法可以提取其中的子串。
二、使用(?:pattern)排除子串
有些情况下,我们需要匹配的内容中包含括号,但是我们并不想使用括号匹配这个内容。例如,我们需要匹配电话号码中的区号和号码,但是不想保留括号,这时我们可以使用(?:pattern)实现排除子串。
import re
phone_numbers = ["(123)456-7890", "123-456-7890"]
pattern = "(?:()?d{3}(?:))?[-]?d{3}[-]?d{4}"
for number in phone_numbers:
result = re.match(pattern, number)
if result:
print(result.group())
上述代码中,数字的括号被排除在外,可以正常匹配。
三、应用于正则表达式中的OR运算
在编写正则表达式的时候,使用OR运算可以匹配多个可能的模式,但是如果某些模式需要与其他内容一起匹配,可以使用圆括号将其分组。
import re
text = "Python is a popular programming language"
pattern = "(Python|Java) (is a) (popular programming language|powerful language)"
result = re.match(pattern, text)
if result:
print("Matched!")
else:
print("Not matched!")
上述代码中,使用括号将OR运算的子串分组,匹配成功后,可以通过group()方法,依次提取每个子串。
四、分组并重复匹配
圆括号可以用来分组并重复匹配它们。例如,一个URL的正则表达式可能需要匹配多个路径,而每个路径都由圆括号括起来。
import re
text = "https://www.example.com/path1/page1 https://www.example.com/path2/page2"
pattern = "https://([w.]+)/([w/]+)"
result = re.findall(pattern, text)
print(result) # [("www.example.com", "path1/page1"), ("www.example.com", "path2/page2")]
上述代码中,使用圆括号对分组进行重复匹配,使用findall()方法可以一次性找到所有匹配,返回一个列表。
五、使用(?P<name>pattern)实现命名分组
在使用分组时,也可以使用名称命名分组,在正则表达式中,可以使用(?P<name>pattern)来对分组进行命名。这种方式可以让代码更加易读易懂。
import re
text = "apple: $1.50, banana: $2.00, orange: $0.50"
pattern = "(?P<fruit>w+):s$(?P<price>d+.d+)"
result = re.findall(pattern, text)
print(result) # [("apple", "1.50"), ("banana", "2.00"), ("orange", "0.50")]
上述代码中,使用(?P<fruit>)和(?P<price>)给分组命名,使用findall()方法一次性找到所有匹配,并返回一个包含所有匹配结果的列表。