一些语法
x 匹配字符 x
. 除换行符外的任何字符
[xyz] 字符类别;匹配x
、y
、z
[abj-oZ] 具有范围的字符类;匹配 a
, b
, j
到o
中的任何字母或 Z
[^A-Z] 否定字符类,即该类中的字符以外的任何字符 [^A-Z\n] 除大写字母或换行符外的任何字符
r* 零个或多个r
,其中r
是任何正则表达式(如何确定r:*前的子表达式)
r+ 一个或多个 r
r? 零或一个r
r{2,5} 从两到五个
r{2,} 两个或多个
r{4} 恰好4个
上面这些默认是最长匹配,加一个?则是最短匹配
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
{name} 扩展name
定义,把别处定义的name
拿过来用
\X 普通字符(不是特殊字符,比如不是*
,"
等)不转义,就是表示\x
。否则,为字符X
举例:”[xyz]"foo” 表示[xyz]"foo
,外面的””表示是一个字符串,里面的"表示是一个转义字符,匹配"
\0 一个NUL字符(ASCII代码0)
\123 八进制值123的字符
\x2a 十六进制值为2a的字符
(r) 匹配r
;定义子表达式;括号用于改变优先级;且可以和\1
等配合进行捕获
rs 正则表达式r
后跟正则表达式s
,称为串联
r|s r
或s
r/s 一个r
,但前提是其后跟一个s
。确定此规则是否为最长匹配项时,
将包含用s
匹配的文本,但在执行操作之前,该文本将返回到输入。因此,
该操作只会看到与r
匹配的文本。这种模式称为尾随上下文。 (flex不能正确
匹配某些r/s组合。有关危险的尾随上下文,请参见限制。)
^r 一个r
,但仅在一行的开头(即刚开始扫描时,或在扫描换行符之后)。
r$ 一个r
,但只能在一行的末尾(即,在换行符之前)。等同于r/\n。
请注意,flex的”换行符”概念与C编译器用来将flex解释为\n的情况完全相同。
特别是,在某些DOS系统上,您必须自己过滤掉输入中的\r,
或显式地将” r /\r\ n”用作” r $”。
r 一个r
,但仅在起始条件s中(请参阅”起始条件”以了解起始条件)。
<s1,s2,s3> r 同上,但在任何启动条件s1,s2或s3中。
<*> r 任何开始条件下的r
,甚至是排他条件。
<< EOF >> 文件结束。
<s1,s2><
匹配任意字符串
注意这样不行:[.\n]* 这样会匹配.
或\n
而不是任意字符
要这样写:(.|\n)*
python正则表达式
获取第一个匹配项的位置和值
import re
pattern = r"\d+"
string = "The price is 20 dollars and 50 cents."
match = re.search(pattern, string)
if match:
print("匹配项的位置:", match.start()) # 匹配项的起始位置
print("匹配项的结束位置:", match.end()) # 匹配项的结束位置
print("匹配项的值:", match.group()) # 匹配项的值
获取所有匹配项的位置和值
import re
pattern = r"\w+"
string = "Python is a popular programming language."
matches = re.finditer(pattern, string)
for match in matches:
print("匹配项的位置:", match.start()) # 匹配项的起始位置
print("匹配项的结束位置:", match.end()) # 匹配项的结束位置
print("匹配项的值:", match.group()) # 匹配项的值