Python 中字符串类型本质上没有标记“是否原始”的特性,原始字符串只是为了书写方便。运行时,原始字符串与普通字符串的表现是相同的,唯一的区别是编写代码时是否进行了转义。
因此,如果需要确保某些输入是有效正则表达式,可以结合 re
模块验证:
import re
def is_valid_regex(pattern):
try:
re.compile(pattern)
return True
except re.error:
return False
print(is_valid_regex(r"\d+")) # True
print(is_valid_regex("\\d+")) # True
print(is_valid_regex("[")) # False
正则表达式练习
- 编译正则表达式
re.compile()
函数主要用于将一个正则表达式字符串编译为一个正则表达式对象。这使得后续的正则表达式操作更加高效和方便。- 例如,要匹配一个或多个数字,可以这样使用:
import re # 编译一个用于匹配数字的正则表达式对象 digit_pattern = re.compile(r'\d+')
- 这里
r'\d+'
是一个正则表达式,其中r
表示原始字符串,\d
表示数字字符类,+
是量词,表示一个或多个。通过re.compile()
将其编译为digit_pattern
对象,这个对象就可以用于后续的匹配操作。
- 匹配方法
findall()
方法- 使用编译后的正则表达式对象的
findall()
方法可以在给定的字符串中找到所有匹配的子串。 - 例如,对于前面编译的
digit_pattern
对象,在一个字符串中查找所有数字:text = "abc123def456" matches = digit_pattern.findall(text) print(matches)
- 结果会打印出
['123', '456']
,因为digit_pattern.findall()
会在text
字符串中找到所有符合\d+
(一个或多个数字)模式的子串。
- 使用编译后的正则表达式对象的
search()
方法search()
方法用于在字符串中查找第一个匹配给定正则表达式的子串。- 例如,要查找字符串中第一个数字:
text = "abc123def456" match = digit_pattern.search(text) if match: print(match.group())
- 这里
digit_pattern.search()
会返回一个匹配对象(如果找到匹配的话),通过match.group()
可以获取到匹配的子串,结果会打印出123
,因为它是字符串中第一个符合\d+
模式的子串。
match()
方法match()
方法用于从字符串的开头开始匹配给定的正则表达式。- 例如:
text = "123abc" match = digit_pattern.match(text) if match: print(match.group())
- 结果会打印出
123
,因为digit_pattern.match()
从字符串text
的开头就找到了符合\d+
模式的子串。但是如果字符串是abc123
,digit_pattern.match()
就不会找到匹配,因为它是从字符串开头进行匹配的。
- 分组操作
- 可以在正则表达式中使用括号进行分组,编译后的对象在匹配时可以获取分组的内容。
- 例如,要匹配一个日期格式(如
2024-01-01
)并获取年、月、日的分组:date_pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})') text = "Today is 2024-01-01" match = date_pattern.search(text) if match: year = match.group(1) month = match.group(2) day = match.group(3) print(year, month, day)
- 这里
re.compile(r'(\d{4})-(\d{2})-(\d{2})')
编译了一个带有分组的正则表达式,(\d{4})
用于匹配年份,(\d{2})
分别用于匹配月份和日期。在匹配后,通过match.group(1)
、match.group(2)
和match.group(3)
可以分别获取年、月、日的内容,结果会打印出2024 01 01
。
- 这里
- 使用标志(flags)参数
re.compile()
函数可以接受一个可选的flags
参数,用于修改正则表达式的匹配方式。- 例如,
re.IGNORECASE
标志用于使匹配不区分大小写。import re # 编译一个不区分大小写的用于匹配单词python的正则表达式对象 python_pattern = re.compile(r'python', re.IGNORECASE) text = "Python is a great language" matches = python_pattern.findall(text) print(matches)
- 这里
re.compile(r'python', re.IGNORECASE)
创建了一个不区分大小写的正则表达式对象,用于匹配python
这个单词。所以在text
字符串中,Python
也会被匹配到,结果会打印出['Python']
。其他常见的标志还有re.MULTILINE
(使^
和$
能够匹配每行的开头和结尾)、re.DOTALL
(使."
能够匹配包括换行符在内的任何字符)等。
- 这里