正则表达式——初次尝试

Andrew_qian Andrew_qian     2022-10-31     318

关键词:

虽然BeautifulSoup能帮助我们完成大部分的工作,但是我们还是有必要了解一下正则表达式的产生过程与基本规则的。

在学习正则之前呢,我问了自己几个问题,下面的回答都是我自己的体会或者看别人的文章的启发。

Q : 什么是正则表达式?

** 1、正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串  替换 , 或者  从某个串中  取出  符合某个条件的子串等。

** 2、又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

我们可以吧正则表达式比喻成一个 数学代数公式,现在你面前是一串由1000万个无序数字组成的数字串,我要让你从这个1000万个数字中找到一段或多段能使刚刚那个数学代数式成立的数字

估计以人类的力量,找半年也找不完吧,但是在程序中实现正则表达式的话,他能在很短的时间内匹配到我们想要数据。

Q : 他有什么用?

正则表达式主要是针对字符串进行操作,可以简化对字符串的复杂操作,其主要功能有匹配、切割、替换、获取。正则表达式一定有很多用途,

但是就目前,我只用过正则来分析HTML网页,从网页代码中匹配到我自己想要的东西。比如在一个包含很多超链接的网页中,把所有的超链接匹配出来。

Q : 只有python才有正则表达式吗?

几乎都可以用,我只能说几乎,使用正则表达式时,他们的基本规则时一样的,有的可能会有扩展。

不同的语言(如PHP和JAVA)、相同语言的不同类库(如来自Sun的Java Regular Expression类库跟Apache Jakarta的正则表达式类库)间,用法会有所差别,在使用的时候,要注意这些差别。

 在python中,我们可以通过导入re库,来使用正则表达式。

 

好了,那么先体验一下正则表达式到底有什么强大的地方:http://tool.oschina.net/regex/#

 

正则表达式常用规则:

/*********************************

 

\\w匹配字母数字及下划线
\\W匹配非字母数字及下划线
\\s匹配任意空白字符,等价于 [\\t\\n\\r\\f].
\\S匹配任意非空字符
\\d匹配任意数字,等价于 [0-9]
\\D匹配任意非数字
\\A匹配字符串开始
\\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\\z匹配字符串结束
\\G匹配最后匹配完成的位置
\\n匹配一个换行符
\\t匹配一个制表符
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]用来表示一组字符,单独列出:[amk] 匹配 \'a\',\'m\'或\'k\'
[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
*匹配0个或多个的表达式。
+匹配1个或多个的表达式。
?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
n精确匹配n个前面表达式。
n, m匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a|b匹配a或b
( )匹配括号内的表达式,也表示一个组
/*********************************************

 

 

在python中使用正则表达式时需要注意的地方:

1、在网页匹配中,最好使用修饰符 re.S 使正则表达式可以匹配节点与节点之间的换行。

修饰符描述:
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \\w, \\W, \\b, \\B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
在网页匹配中较为常用的为re.S、re.I。

2、
贪婪匹配: .* 匹配尽可能多的字符,一般常用在表达式的结尾
非贪婪匹配: .*? 匹配尽可能少的字符,用在中间。 

3、转义匹配
当需要匹配的字符串中包含正则表达式定义的特殊字符时,在正则表达式中使用转义字符来进行区别。具体使用和C语言中一样。前面加反斜杠

4、match 和 search
match:从字符串的起始位置开始匹配,如果匹配,返回匹配结果,失败返回None
search:扫描整个字符串,返回第一个匹配成功的内容。失败返回None
大部分情况下,为了使用方便,都是用search

5、findall 获取所有匹配的内容
该方法返回一个 list,list的每个元素都是 tuple 类型。然后遍历整个list即可输出每个匹配的内容。
results = re.findall(\'<li.*?>\\s*?(<a.*?>)?(\\w+)(</a>)?\\s*?</li>\', html, re.S)
for result in results:
print(result[1])

6、sub :匹配并替换文本,返回替换后的文本
比如去掉一个字符串中的所有数字:
content = \'54aK54yr5oiR54ix5L2g\'
content = re.sub(\'\\d+\', \'\', content)
print(content)
就是先匹配出所有的数字,然后用空来替代即可。
利用这个技巧,可以先把一个HTML文本中的大部分无关的东西去掉,然后在进行匹配,可以方便很多。

7、compile :可以将正则表达式的字符串编译成正则表达式对象,方便后面多次使用。相当于给正则表达式做了一层封装。

8、使用group对正则表达式分组的时候,参数0对应整个匹配到的字符串,参数1才对应第一个分组。

  

参考资料:

https://blog.csdn.net/qq_878799579/article/details/72887612

https://www.cnblogs.com/luoshufang/p/5685784.html

 

尝试在java中使用正则表达式时堆栈溢出

】尝试在java中使用正则表达式时堆栈溢出【英文标题】:Stackoverflowwhentryingtouseregexinjava【发布时间】:2019-01-1320:35:44【问题描述】:我已经阅读了一些关于如何优化正则表达式的文章,但没有一个答案(较少的组,使用X,Y而不... 查看详情

Dart 正则表达式错误尝试调用使用?

】Dart正则表达式错误尝试调用使用?【英文标题】:DartregularexpressionerrorTrycallingusing?【发布时间】:2021-04-1817:08:32【问题描述】:我有Error:Method\'group\'cannotbecalledon\'RegExpMatch?\'becauseitispotentiallynull.-\'RegExpMatch\'isfrom\'dart:core\'.Tr 查看详情

正则表达式逗号不表达

】正则表达式逗号不表达【英文标题】:Regexcommasoutofexpression【发布时间】:2013-09-2417:59:30【问题描述】:我正在尝试用正则表达式替换字符串中引号之间的所有逗号。我似乎无法让它以非贪婪的方式匹配它们,所以它不会只是... 查看详情

正则表达式尝试

packageTest;importjava.util.regex.Matcher;importjava.util.regex.Pattern;/**邮箱:@前面包含5-14位数字,字母下划线,@后面是qq,126,163,yahoo,gmail,sina,然后是com或者cn。*电话号码:11位数字,开头两位是13,15,16,17,18,19*身份证18位:5开头;第7、8位19或... 查看详情

正则表达式反向引用乘法[重复]

】正则表达式反向引用乘法[重复]【英文标题】:RegexBackeferenceMultiplying[duplicate]【发布时间】:2019-05-0616:11:01【问题描述】:我正在尝试学习正则表达式,我尝试解决的练习之一如下:我有一个字符串:"londonnewyork"我正在尝试匹... 查看详情

为啥正则表达式引擎允许/自动尝试在输入字符串的末尾进行匹配?

】为啥正则表达式引擎允许/自动尝试在输入字符串的末尾进行匹配?【英文标题】:Whydoregexenginesallow/automaticallyattemptmatchingattheendoftheinputstring?为什么正则表达式引擎允许/自动尝试在输入字符串的末尾进行匹配?【发布时间】:... 查看详情

Grafana 正则表达式

】Grafana正则表达式【英文标题】:Grafanaregularexpression【发布时间】:2019-12-0213:59:03【问题描述】:我正在研究grafana并尝试找到一个可以匹配以下任何场景的正则表达式。1)valuescanbeofformatfg-elastic-*2)valuescanbeofformatfgelastic-*我正在... 查看详情

正则表达式 - 尝试从字符串中提取 5 位单词(presto)

】正则表达式-尝试从字符串中提取5位单词(presto)【英文标题】:Regex-tryingtogetthe5digitwordsextractedfromthestring(presto)【发布时间】:2021-07-1622:27:28【问题描述】:我正在尝试检索括号中的5个数字/字母的每个序列,就像这个例子一... 查看详情

尝试在 Python / pandas 中使用正则表达式获取子字符串

】尝试在Python/pandas中使用正则表达式获取子字符串【英文标题】:TryingtogetasubstringusingregexinPython/pandas【发布时间】:2019-07-0603:08:18【问题描述】:我知道这可能看起来很愚蠢,但我一直在到处寻找并尝试使用正则表达式并徒劳... 查看详情

正则表达式慢

】正则表达式慢【英文标题】:Regularexpressionslow【发布时间】:2012-06-2123:56:03【问题描述】:我正在尝试使用正则表达式解析构建日志文件以获取一些信息。我正在尝试使用像("(9time)(.+)(c1xx\\\\.dll+)(.+)s")这样的正则表达式... 查看详情

如何在 shell 脚本中使用正则表达式?

】如何在shell脚本中使用正则表达式?【英文标题】:HowdoIusearegexinashellscript?【发布时间】:2016-06-2510:50:33【问题描述】:我正在尝试将字符串与shell脚本中的正则表达式匹配。此字符串是脚本的参数($1),它是日期(MM/DD/YYYY)我正... 查看详情

“1”的 C++ 字符串与“1”不匹配(尝试了正则表达式和布尔值 '==')

】“1”的C++字符串与“1”不匹配(尝试了正则表达式和布尔值\\\'==\\\')【英文标题】:C++stringof"1"doesnotmatch"1"(triedregexandboolean\'==\')“1”的C++字符串与“1”不匹配(尝试了正则表达式和布尔值\'==\')【发布时间... 查看详情

一个可以使用多个正则表达式进行多次尝试匹配,并进行替换的excelvba自定义函数(ufd)

以下代码可使用多个正则表达式对目标单元格进行多次匹配尝试,如匹配成功,将停止尝试匹配其他正则表达式,并且使用该正则表达式相对应的替换表达式进行替换,返回替换结果。使用前需要做EarlyBinding。即在VBE编辑器中,... 查看详情

正则表达式入门量词

1223334444555556666667777777888888889999999990000000000将排列成直角三角形的数字粘贴到程序中。贪心,懒惰和占有量词本身是贪心的,贪心的量词会首先匹配整个字符串。尝试匹配时,它会选定尽可能多的内容,也就是整个输入。量词首... 查看详情

正则表达式与 ls 的用法

】正则表达式与ls的用法【英文标题】:RegularExpressionusagewithls【发布时间】:2013-02-2701:31:21【问题描述】:我正在尝试将ER(扩展正则表达式)与ls一起使用,例如ls.+\\..+。我正在尝试打印所有包含扩展名的文件(我知道我可以... 查看详情

Django 2.0 尝试使用正则表达式获取主键,但我得到 404

】Django2.0尝试使用正则表达式获取主键,但我得到404【英文标题】:Django2.0TryingtoGrabtheprimarykeywithregularExpressionsbutimgetting404【发布时间】:2018-09-2509:15:26【问题描述】:这是我的代码..urlpatterns=[path(\'\',views.School_Lview.as_view(),name=\'... 查看详情

我正在尝试使用正则表达式来指定字符数量。大括号不起作用[重复]

】我正在尝试使用正则表达式来指定字符数量。大括号不起作用[重复]【英文标题】:I\'mtryingtouseregextospecifyamountofcharacters.Thecurlybracketsarenotworking[duplicate]【发布时间】:2018-11-2115:59:31【问题描述】:varvalidRegExp=/^[0-9]+[-]+[0-9]+$/;这... 查看详情

正则表达式单元测试通过,但实际上尝试使用它时似乎无法正常工作

】正则表达式单元测试通过,但实际上尝试使用它时似乎无法正常工作【英文标题】:Regexunittestpassesbutdoesn\'tappeartoworkproperlyactuallytryingtouseit【发布时间】:2016-09-1423:51:15【问题描述】:ThisisalinktotheStringinalinter.这就是表达式本... 查看详情