3

regex正则表达式

 2 years ago
source link: https://caojiangxia.github.io/regex/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

regex正则表达式

Posted on 2019-08-15

|

Post modified: 2019-08-15

| In algorithm

| Visitors:

Words count in article:

正则表达式

正则表达式匹配指的是一种文本匹配。其形式为一系列普通字符和元字符构成。其使用字符串的形式来匹配满足某种句法形式的字符串。

正则表达式功能极其强大,我们就按照下面的方式一一进行介绍吧!

所有的元字符如下所示,同时元字符主要分为下面两类:限定符、定位符。

\ 表示转义符号,\n,\t,\r之类的

$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 也匹配‘\n′或‘\r′。要匹配 字符本身,请使用 $

() 表示一个子表达式的开始和结束位置。若想匹配(),前面需要加\

* 表示子表达式需要匹配零次或者多次

+ 表示子表达式至少要匹配一次

. 匹配除了\n,\r这种换行符以外的任何字符,非常常用

? 表示匹配子表达式零次或者一次

^ 匹配输入字符串的开始位置

\

表示匹配两个子表达式的任何一个

{} 标记限定表达式的开始和结束

[] 标记一个中括号表达式的开始和结束

注意: +,*限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。

对于[]的一个使用例子,中括号一般都伴随着-符号,表示范围,或者是多个字符串,表示匹配任何一个都可以:

Chapter [1-9][0-9]*

# [a-z]+

匹配一本书的所有章节的话,由于章节数是不确定的,同时每一位都是不确定的,但是首位非0,于是我们可以按位设计正则表达式,这时候我们就用到了中括号表示区分。

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足,主要有\*,+,?,{n},{n,},{n,m}六种

其含义如下:

* 匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。

+ 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。

? 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}。

{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。

{n,} n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。

{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格

  • runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
  • runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
  • colou?r 可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)

定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。

定位符用来描述字符串或单词的边界,^$ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。

^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。

$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。

\\b 匹配一个单词边界,即字与空格间的位置。

\\B 匹配非单词边界。

注意:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。

若要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符。不要将 ^ 的这种用法与中括号表达式内的用法混淆。

若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用 $ 字符。

若要在搜索章节标题时使用定位点,下面的正则表达式匹配一个章节标题,该标题只包含两个尾随数字,并且出现在行首:

^Chapter [1-9][0-9]{0,1}

真正的章节标题不仅出现行的开始处,而且它还是该行中仅有的文本。它即出现在行首又出现在同一行的结尾。下面的表达式能确保指定的匹配只匹配章节而不匹配交叉引用。通过创建只匹配一行文本的开始和结尾的正则表达式,就可做到这一点。

^Chapter [1-9][0-9]{0,1}$

匹配单词边界稍有不同,但向正则表达式添加了很重要的能力。单词边界是单词和空格之间的位置。非单词边界是任何其他位置。下面的表达式匹配单词 Chapter 的开头三个字符,因为这三个字符出现在单词边界后面:

\bCha

\b 字符的位置是非常重要的。如果它位于要匹配的字符串的开始,它在单词的开始处查找匹配项。如果它位于字符串的结尾,它在单词的结尾处查找匹配项。例如,下面的表达式匹配单词 Chapter 中的字符串 ter,因为它出现在单词边界的前面:

ter\b

下面的表达式匹配 Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt:

\Bapt

选择一般是用圆括号将所有的子表达式都括起来,相邻的选择项之间使用符号|进行分割。

元字符的使用

x\ y 匹配x或者y,其中x和y可以是单词,例如zoo\ animal

[xyz] 表示匹配x,y,z任何一个字符都可以,但是这里不能是单词

xyz 负值字符集合,匹配未包含在这里面的字符。例如, ‘abc‘ 可以匹配 “plain” 中的’p’、’l’、’i’、’n’。

[a-z] 表示字符范围,匹配指定范围的任意字符。

a-z 负值字符范围。匹配任何不在这里指定范围的任意字符。

\d 匹配一个数字字符,等价于[0-9]

\D 匹配一个非数字字符,等价于[^0-9]

\w 匹配字母数字下划线。等价于[A-Za-z0-9_]

\W 匹配非字母、数字、下划线。等价于 [^A-Za-z0-9_]

(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的Matches 集合得到。

基本匹配模式

首先使用最基本的行首匹配

import re

A="caojiangxia"
B="liuguiru"
C="cao"
print(re.match("^cao",A))
print(re.match("^cao",B))
print(re.match("^cao$",C))
<_sre.SRE_Match object; span=(0, 3), match='cao'>
None
<_sre.SRE_Match object; span=(0, 3), match='cao'>

根据上面的代码,我们可以看到,匹配的模式我们写在左边的参数上,右边的参数为我们所需要进行匹配的字符串。

[a-z] //匹配所有的小写字母 
[A-Z] //匹配所有的大写字母
[a-zA-Z] //匹配所有的字母
[0-9] //匹配所有的数字
[0-9\.\-] //匹配所有的数字,句号和减号
[ \f\r\t\n] //匹配所有的白字符
[AaEeIiOoUu] //匹配所有元音字符

这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如”z2”、”t6”、”g7”、”a3a3a3”这样的话

([a-z][0-9])*

如果我们希望匹配确定的几组的话,我们应该这样做

([a-z][0-9]){2} # 2表示匹配2组
A=["中国sdas成立","中国asd建国","祖国建国","美国成立"]

for i in A:
if re.match("((中|祖)国).*(成立|建国)",i):
print("yes")
else :
print("no")

https://www.runoob.com/regexp/regexp-tutorial.html

如果你喜欢这篇文章,可以支持我继续更新呀!
感谢您的阅读,欢迎在评论区纠错。如需转载,请注明本文出处,谢谢。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK