正则表达式中,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。要匹配实际的点,请使用反斜杠转义点:\ ..