正则表达式
正则表达式(或RE)指定了一组与之匹配的字符串;该模块中的函数可让您检查特定字符串是否与给定的正则表达式匹配(或给定的正则表达式是否与特定的字符串匹配,这取决于同一件事)。
正则表达式语法
pattern[过滤模式]
从string中匹配出符合条件的字符
1.字符集合
如:[abcde],[12345]
2.字符范围
如:[a-z],[0-9]
1.+(子表达式后),匹配符合子表达式一次和一次以上的内容 (>=1)
如:('[0-9]+')
2.*(子表达式后),匹配符合子表达式零次和零次以上的内容 (>=0)
如:('[0-9]*')
3.?(子表达式后),匹配符合子表达式零到一次的内容 (0-1)
如:('[0-9]?')
4.$,匹配输入行尾
5.^,匹配输入行头
1.{n},匹配n次
1.\d,匹配一个数字字符,等价于[0-9]
2.\D,匹配一个非数字字符,等价于[^0-9]
^在中括号中代表’非‘
3.\s,匹配任何不可见字符
如:空格,制表符,换页符等等
4.\S,匹配任何可见字符
5.\w(word),匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
6.\W,匹配任何非单词字符,等价于[^A-Za-z0-9_]
7.\b,匹配一个单词的边界,也就是指单词和空格间的位置
8..,匹配除了'\n'和'\r'以外的单个字符
1.|,将两个匹配条件进行逻辑’或‘运算
2.(),将(和)之间的表达式定义为“组”(group)
1.贪婪模式:默认为贪婪模式,匹配尽量多的字符
2.非贪婪模式:匹配尽量少的字符,在次数限制操作符后面加上'?'转换为非贪婪模式
[]
用于指示一组字符。在一组中:
- 字符可以单独列出,例如[amk]将匹配’a’,‘m’或’k’。
- 可以通过给两个字符并用’-‘隔开来表示字符范围,例如[az]可以匹配任何小写ASCII字母,[0-5]
[0-9]可以匹配所有的两位数字00到59,并且[0-9A-Fa-f]将匹配任何十六进制数字。如果-被转义(例如[a
-z]),或者如果将其放置为第一个或最后一个字符(例如[-a]或[a-]),则它将匹配文字’-’。 - 特殊字符在集合内失去其特殊含义。例如,[(+ *)]将匹配任何文字字符’(’,’+’,’*‘或’)’。
- 集合中也接受\ w或\ S之类的字符类(在下面定义),尽管它们匹配的字符取决于是否启用了ASCII或LOCALE模式。
- 可以通过补充集合来匹配不在范围内的字符。如果集合中的第一个字符是’^’,则所有不在集合中的字符都将被匹配。例如,[^5]将匹配’5’以外的任何字符,而[^^]将匹配’^'以外的任何字符。 ^如果不是集合中的第一个字符,则没有特殊含义。
- 要在集合中匹配文字’]’,请在其前面加上反斜杠,或将其放在集合的开头。例如,[()[] {}]和[]()[{}]都将与括号匹配。
- 将来可能会增加对嵌套集和集操作的支持(如Unicode技术标准#18)。这将更改语法,因此为了便于进行此更改,暂时将在不明确的情况下引发FutureWarning。包括以文字’[‘开头或包含文字字符序列’-’,’&&’,’~~‘和’||'的集合。
为避免警告,请使用反斜杠将其转义。
例如:
message = 'fjlrb2i4t9gjibuspabr'
result = re.search('[abcde]',message)
print(result)
result = re.search('[a-z][a-d]',message)
print(result)
result = re.search('[a-z][0-9]',message)
print(result)
result = re.findall('[a-z][0-9]',message)
print(result)
<_sre.SRE_Match object; span=(4, 5), match='b'>
<_sre.SRE_Match object; span=(3, 5), match='rb'>
<_sre.SRE_Match object; span=(4, 6), match='b2'>
['b2', 'i4', 't9']
+
使结果RE匹配先前RE的1个或多个重复。 ab +将与“ a”匹配,后跟任意非零数目的“ b”; 它不会仅与“ a”匹配。
例如:
message = 'verb very never every'
result = re.findall(r'\w+er\B',message)
print(result)
['ver', 'ver', 'ever']
*
使结果RE与前面的RE的0个或多个重复匹配,并尽可能多地重复。 ab *将匹配“ a”,“ ab”或“ a”,后跟任意数量的“ b”。
例如:
message = 'h25tv988yrgnbn25uyt3n9y2'
result = re.findall('[a-z]*[0-9][a-z]',message)
print(result)
['5t', '8y', '5u', 'yt3n', '9y']
?
使结果RE匹配先前RE的0或1个重复。 ab? 将匹配“ a”或“ ab”。
例如:
message = 'ccc2356145507'
result = re.findall('ccc\d+?',message)
print(result)
['ccc2']
$
匹配字符串的末尾或在字符串末尾的换行符之前,并且在MULTILINE模式下也匹配换行符的前面。 foo同时匹配“ foo”和“ foobar”,而正则表达式foo $仅匹配“ foo”。
例如:
QQ_number = input('请输入您的QQ号码:')
result = re.findall('^[1-9][0-9]{4,10}$',QQ_number)
print(result)
请输入您的QQ号码:123456
['123456']
^
匹配字符串的开头,并且在MULTILINE模式下还匹配每个换行符之后的字符串。
例如:
QQ_number = input('请输入您的QQ号码:')
result = re.findall('^[1-9][0-9]{4,10}$',QQ_number)
print(result)
请输入您的QQ号码:123456
['123456']