lua 正则匹配字符串中的数字 正则匹配字符串后的值_正则匹配括号里面的内容不包括括号


贪心和非贪心匹配

Python 的正则表达式默认是“贪心” 的, 这表示在有二义的情况下,它们会尽可能匹配最长的字符串。花括号的“非贪心” 版本匹配尽可能最短的字符串,即在结束的花括号后跟着一个问号。注意在查找相同字符串时, 花括号的贪心形式和非贪心形式之间的区别。


lua 正则匹配字符串中的数字 正则匹配字符串后的值_正则匹配括号里面的内容不包括括号_02


请注意, 问号在正则表达式中可能有两种含义: 声明非贪心匹配或表示可选的分组。这两种含义是完全无关的。

findall()方法

除了 search方法外,Regex对象也有一个 findall()方法。search()将返回一个 Match对象, 包含被查找字符串中的“第一次” 匹配的文本,而 findall()方法将返回一组 字符串, 包含被查找字符串中的所有匹配。


lua 正则匹配字符串中的数字 正则匹配字符串后的值_正则匹配括号里面的内容不包括括号_03


另一方面, findall()不是返回一个 Match 对象, 而是返回一个字符串列表, 只要 在正则表达式中没有分组。列表中的每个字符串都是一段被查找的文本, 它匹配该 正则表达式。 如果在正则表达式中有分组, 那么 findall 将返回元组的列表。每个元组表示一个找 到的匹配,其中的项就是正则表达式中每个分组的匹配字符串。为了看看 findall()的效果, 请在交互式环境中输入以下代码(请注意, 被编译的正则表达式现在有括号分组):


lua 正则匹配字符串中的数字 正则匹配字符串后的值_正则匹配字符串后的值_04


作为 findall()方法的返回结果的总结,请记住下面两点:

1. 如果调用在一个没有分组的正则表达式上, 例如ddd-ddd-dddd, 方法 findall()将返回一个匹配字符串的列表, 例如['415-555-9999', '212-555-0000']。

2. 如果调用在一个有分组的正则表达式上, 例如(ddd)-(ddd)-(dddd), 方 法 findall()将返回一个字符串的元组的列表(每个分组对应一个字符串),例如[('415', '555', '1122'), ('212', '555', '0000')]。

字符分类

在前面电话号码正则表达式的例子中, 你知道d 可以代表任何数字。

也就是说,

d 是正则表达式(0|1|2|3|4|5|6|7|8|9)的缩写。有许多这样的“缩写字符分类”, 如下表示

d 0 到 9 的任何数字

D 除 0 到 9 的数字以外的任何字符

w 任何字母、数字或下划线字符(可以认为是匹配“单词”字符)

W 除字母、数字和下划线以外的任何字符

s 空格、制表符或换行符(可以认为是匹配“空白”字符)

S 除空格、制表符和换行符以外的任何字符

字符分类对于缩短正则表达式很有用。字符分类[0-5]只匹配数字 0 到 5, 这比 输入(0|1|2|3|4|5)要短很多。


lua 正则匹配字符串中的数字 正则匹配字符串后的值_正则文 匹配所有非换行符制表符_05


正则表达式d+sw+匹配的文本有一个或多个数字(d+), 接下来是一个空白字 符(s), 接下来是一个或多个字母/数字/下划线字符(w+)。

findall()方法将返回所有匹 配该正则表达式的字符串, 放在一个列表中。

插入字符和美元字符

可以在正则表达式的开始处使用插入符号(^),表明匹配必须发生在被查找文本开始处。类似地,可以再正则表达式的末尾加上美元符号(),表示该字符串必须以这个正则表达式的模式结束。可以同时使用和,表明整个字符串必须匹配该模式,也就是说,只匹配该字符串的某个子集是不够的。


lua 正则匹配字符串中的数字 正则匹配字符串后的值_lua 正则匹配字符串中的数字_06


如果使用了^和$,那么整个字符串必须匹配该正则表达式。

通配字符

在正则表达式中, .(句点)字符称为“通配符”。它匹配除了换行之外的所有字符。


lua 正则匹配字符串中的数字 正则匹配字符串后的值_正则匹配括号里面的内容不包括括号_07


要记住,句点字符只匹配一个字符, 这就是为什么在前面的例子中, 对于文本flat, 只匹配 lat。要匹配真正的句点, 就是用倒斜杠转义:. 。

用点-星匹配所有字符

想要匹配所有字符串。例如,假定想要匹配字符串'First Name:',接下来 是任意文本,接下来是'Last Name:',然后又是任意文本。可以用点-星(.*)表示“任 意文本”。回忆一下,句点字符表示“除换行外所有单个字符”,星号字符表示“前 面字符出现零次或多次”。


lua 正则匹配字符串中的数字 正则匹配字符串后的值_正则匹配字符串后的值_08


点-星使用“贪心” 模式:它总是匹配尽可能多的文本。要用“非贪心” 模式匹配 所有文本, 就使用点-星和问号。像和大括号一起使用时那样, 问号告诉 Python 用非贪 心模式匹配。贪心模式和非贪心模式的区别:


lua 正则匹配字符串中的数字 正则匹配字符串后的值_正则匹配括号里面的内容不包括括号_09


两个正则表达式都可以翻译成“匹配一个左尖括号,接下来是任意字符,接下 来是一个右尖括号”。但是字符串' for dinner.>'对右肩括号有两种可能的 匹配。在非贪心的正则表达式中, Python 匹配最短可能的字符串: ''。 在贪心版本中, Python 匹配最长可能的字符串: ' for dinner.>'。

用句点字符匹配换行

点-星将匹配除换行外的所有字符。通过传入 re.DOTALL 作为 re.compile()的第 二个参数, 可以让句点字符匹配所有字符, 包括换行字符。


lua 正则匹配字符串中的数字 正则匹配字符串后的值_正则文 匹配所有非换行符制表符_10


正则表达式 noNewlineRegex 在创建时没有向 re.compile()传入 re.DOTALL, 它 将匹配所有字符, 直到第一个换行字符。但是, newlineRegex 在创建时向 re.compile()传 入了 re.DOTALL,它将匹配所有字符。这就是为什么 newlineRegex.search()调用匹配完 整的字符串, 包括其中的换行字符。

正则表达式符号复习

介绍了许多表示法, 所以这里快速复习一下学到的内容:

匹配零次或多次前面的分组。

+匹配一次或多次前面的分组。

{n}匹配 n 次前面的分组。

{n,}匹配 n 次或更多前面的分组。

{,m}匹配零次到 m 次前面的分组。

{n,m}匹配至少 n 次、至多 m 次前面的分组。

{n,m}?或?或+?对前面的分组进行非贪心匹配。

^spam 意味着字符串必须以 spam 开始。

spam$意味着字符串必须以 spam 结束。

.匹配所有字符,换行符除外。

d、 w 和s 分别匹配数字、单词和空格。

D、 W 和S 分别匹配出数字、单词和空格外的所有字符。

[abc]匹配方括号内的任意字符(诸如 a、 b 或 c)。

[^abc]匹配不在方括号内的任意字符。