正则表达式中,findall( ) ^ $ . 与 字符类的应用
Posted 怪兽宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式中,findall( ) ^ $ . 与 字符类的应用相关的知识,希望对你有一定的参考价值。
findall()方法
- 除了search()方法,Regex对象还有一个findall()方法。当search()将返回搜索字符串中第一个匹配文本的Match对象时,findall()方法将返回搜索字符串中每个匹配的字符串。
import re
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
mo = phoneNumRegex.search('Cell: 415-555-9999 Work: 212-555-0000')
mo.group()
‘415-555-9999’
- 另一方面,findall()不会返回一个Match对象,而是一个字符串列表,只要正则表达式中没有任何组。列表中的每个字符串都是与正则表达式匹配的搜索文本。
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') # has no groups
phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000')
[‘415-555-9999’, ‘212-555-0000’]
如果正则表达式中有组,那么findall()将返回一个元组列表。每个元组表示一个找到的匹配,它的项是正则表达式中每个组的匹配字符串。
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)') # has groups
phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000')
[(‘415’, ‘555’, ‘9999’), (‘212’, ‘555’, ‘0000’)]
- 总结findall()方法返回,请记住以下内容:
-
- 当没有组的正则表达式调用时,例如\ d \ d \ d- \ d \ d \ d- \ d \ d \ d \ d,方法findall()返回一个字符串匹配列表,如[‘ 415-555-9999’,’212-555-0000’]。
-
- 当对具有组的正则表达式(例如(\ d \ d \ d) - (\ d \ d \ d) - (\ d \ d \ d \ d))调用时,findall()方法返回一个元组列表([415’,’555’,’9999’),(’212’,’555’,’0000’)的字符串(每个组的一个字符串)]。
字符类
- 在上面的电话号码正则表达式示例中,您了解到\ d可以代表任何数字。也就是说,\ d是正则表达式(0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9)的缩写。有很多这样的速写字符类,如表7-1所示。
速记字符类 | 含义 |
---|---|
\d | 任意数字从0到9。 |
\D | 任何字符内不含0到9之间的数字 |
\w | 任何不是字母,数字或下划线字符的字符 |
\s | 任何空格,制表符或换行符 |
\S | 任何不是空格,制表符或换行符的字符 |
- 字符类对缩短正则表达式很好。字符类[0-5]将仅匹配数字0到5;这比打字(0 | 1 | 2 | 3 | 4 | 5)短得多。
xmasRegex = re.compile(r'\d+\s\w+')
xmasRegex.findall('12 drummers, 11 pipers, 10 lords, 9 ladies, 8 maids, 7swans, 6 geese, 5 rings, 4 birds, 3 hens, 2 doves, 1 partridge')
[‘12 drummers’,
‘11 pipers’,
‘10 lords’,
‘9 ladies’,
‘8 maids’,
‘6 geese’,
‘5 rings’,
‘4 birds’,
‘3 hens’,
‘2 doves’,
‘1 partridge’]
- 正则表达式\ d \ s \ w将匹配具有一个或多个数字(\ d),后跟空格字符(\ s),后跟一个或多个字母/数字/下划线字符(\ w)的文本。 findall()方法返回列表中正则表达式模式的所有匹配字符串。
制作你自己的字符类
有时你想要匹配一组字符,但速写字符类(\ d,\ w,\ s等)太宽泛了。您可以使用方括号定义自己的角色类。例如,字符类[aeiouAEIOU]将匹配任何元音,小写和大写。
vowelRegex = re.compile(r'[aeiouAEIOU]') vowelRegex.findall('Robocop eats baby food. BABY FOOD.')
[‘o’, ‘o’, ‘o’, ‘e’, ‘a’, ‘a’, ‘o’, ‘o’, ‘A’, ‘O’, ‘O’]
您还可以使用连字符包括字母或数字的范围。例如,字符类[a-zA-Z0-9]将匹配所有小写字母,大写字母和数字。
- 请注意,在方括号内,正常的正则表达式符号不会如此解释。这意味着您不需要使用前面的反斜杠来转义。,*,?或()字符。例如,字符类[0-5.]将匹配数字0到5和一个句点。你不需要把它写成[0-5 .]。
- 通过在字符类的开头括号后面放置一个插入符号(^),您可以进行负面字符类。负面字符类将匹配不在字符类中的所有字符。
consonantRegex = re.compile(r'[^aeiouAEIOU]')
consonantRegex.findall('Robocop eats baby food. BABY FOOD.')
[‘R’,
‘b’,
‘c’,
‘p’,
‘ ‘,
‘t’,
‘s’,
‘ ‘,
‘b’,
‘b’,
‘y’,
‘ ‘,
‘f’,
‘d’,
‘.’,
‘ ‘,
‘B’,
‘B’,
‘Y’,
‘ ‘,
‘F’,
‘D’,
‘.’]
- 现在,我们不是匹配每个元音,而是匹配不是元音的每个字符。
插入符号和美元符号字符
- 您也可以使用正则表达式开头的插入符号(^)来表示匹配必须在搜索文本的开始处出现。同样,您可以在正则表达式的末尾放一个美元符号($),以指示字符串必须以此正则表达式模式结束。您可以使用^和$一起表示整个字符串必须与正则表达式匹配 - 也就是说,在字符串的某个子集上进行匹配是不够的。
- 例如,r’^ Hello’正则表达式字符串匹配以“Hello”开头的字符串。
beginsWithHello = re.compile(r'^Hello')
beginsWithHello.search('Hello world!')
<_sre.SRE_Match object; span=(0, 5), match='Hello'>
beginsWithHello.search('He said hello.') == None
True
- r’\ d+$’正则表达式字符串匹配以0到9的数字字符结尾的字符串。
endsWithNumber = re.compile(r'\d$')
endsWithNumber.search('Your number is 42')
<_sre.SRE_Match object; span=(16, 17), match='2'>
endsWithNumber.search('Your number is forty two.') == None
True
- r’^ \ d + $’正则表达式字符串匹配以一个或多个数字字符开头和结尾的字符串。
wholeStringIsNum = re.compile(r'^\d+$')
wholeStringIsNum.search('1234567890')
<_sre.SRE_Match object; span=(0, 10), match='1234567890'>
wholeStringIsNum.search('12345xyz67890') == None
True
wholeStringIsNum.search('12 34567890') == None
True
- 前一个代码示例中的最后两个search()调用演示了如果使用^和$,整个字符串必须与正则表达式匹配。
- 我总是混淆这两个符号的含义,所以我使用助记符“胡萝卜花费美元”提醒自己,插入符号是首先,美元符号是最后的。
通配符
.
(点)字符称为通配符,并将匹配除换行之外的任何字符。
atRegex = re.compile(r'.at')
atRegex.findall('The cat in the hat sat on the flat mat.')
[‘cat’, ‘hat’, ‘sat’, ‘lat’, ‘mat’]
- 请记住,点的字符只匹配一个字符,这就是为什么前面示例中的文本平面匹配只有lat。要匹配实际的点,请使用反斜杠转义点:\ ..
以上是关于正则表达式中,findall( ) ^ $ . 与 字符类的应用的主要内容,如果未能解决你的问题,请参考以下文章
Python面试必考重点之字符串与正则表达式第十二关——findall函数的使用