20-用点-星匹配所有字符
7.9.1 用点-星匹配所有字符
有时候想要匹配所有字符串。例如,假定想要匹配字符串 'First Name:'
,接下来是任意文本,再接下来是 'Last Name:'
,然后又是任意文本。可以用点-星( .*
)表示“任意文本”。回忆一下,句点字符表示“换行符外的所有单个字符”,星号字符表示“前面字符出现零次或多次”。
在交互式环境中输入以下代码:
>>> nameRegex = re.compile(r'First Name: (.*) Last Name: (.*)')
>>> mo = nameRegex.search('First Name: Al Last Name: Sweigart')
>>> mo.group(1)
'Al'
>>> mo.group(2)
'Sweigart'
点-星使用“贪心”模式:它总是匹配尽可能多的文本。要用“非贪心”模式匹配所有文本,就使用点-星和问号,像和大括号一起使用时那样,问号告诉Python用非贪心模式匹配。
在交互式环境中输入以下代码,看看贪心模式和非贪心模式的区别:
>>> nongreedyRegex = re.compile(r'<.*?>')
>>> mo = nongreedyRegex.search('<To serve man> for dinner.>')
>>> mo.group()
'<To serve man>'
>>> greedyRegex = re.compile(r'<.*>')
>>> mo = greedyRegex.search('<To serve man> for dinner.>')
>>> mo.group()
'<To serve man> for dinner.>'
两个正则表达式都可以翻译成“匹配一个左尖括号,接下来是任意字符,然后是一个右尖括号”。但是字符串 '<To serve man> for dinner.>'
对右尖括号有两种可能的匹配。在非贪心的正则表达式中,Python匹配最短可能的字符串: '<To serve man>'
。在贪心的正则表达式中,Python匹配最长可能的字符串: '<To serve man> for dinner.>'
。