讲一些正则表达式的细节问题

一、为什么使用原生字符串

r''指的是原生字符串,目的是将Python中反斜杠的含义取消,避免发生冲突
例一:目标字符串为'ab\bc\cd',想要匹配'ab\'
我们知道一个\需要用两个\\来匹配,正则表达式应改写为ab\\,进而在Python中应改写为"ab\\\\"。
一串字符需要经过Python解释器的转义和正则表达式的转义,这样做显然比较麻烦。所以我们可以使用r''原生字符串跳过Python的转义。
例二:目标字符串为'abc word 123',想要匹配单词'word'。我们需要注意:\b在Python中表示退格,而在正则中表示匹配一个单词的边界位置。
所以正则表达式必须写为r'\bword\b'。
因此在写正则表达式时,最好写上原生标记r''。

import re
pattern = re.compile(r'\bword\b')
print(re.search(pattern, 'abc word 123'))
#输出
#<_sre.SRE_Match object; span=(4, 8), match='word'>


str="ab\\bc\\cd"
res1=re.match("ab\\\\",str)
print(str,res1)
#输出ab\bc\cd <_sre.SRE_Match object; span=(0, 3), match='ab\\'>

二、.*?有什么含义

.  匹配除\n以外的任意字符
* 前面一个字符出现0次或多次
?表示非贪婪匹配
a.*?b匹配最短的,以a开始,以b结束的字符串。
对于aabab,它会匹配到aab和ab。

三、非捕获组是什么?以及findall匹配分组时的特点?\b如何匹配单词边界?

import re
str='ababab abbabb aabaab'
res61=re.findall(r'\b(?:ab)+\b',str)
res62=re.findall(r'(ab)+',str)#将字符串所有ab都匹配出来,因为有分组,只显示分组内容
res63=re.findall(r'\b(ab)+\b',str)#匹配出单词ababab,只显示分组内容
res64=re.findall(r'(?:ab)+',str)#将字符串所有ab都匹配出来,无捕获组即显示全部内容
print(res61,res62,res63,res64)
#输出
#['ababab'] ['ab', 'ab', 'ab', 'ab', 'ab'] ['ab'] ['ababab', 'ab', 'ab', 'ab', 'ab']


res7=re.findall(r'(\d{3}-)?(\d{7})','020-8888888\n010-1234567')
print(res7)
res8=re.findall(r'(?:\d{3}-)?(?:\d{7})','020-8888888\n010-1234567')
print(res8)
#输出
#[('020-', '8888888'), ('010-', '1234567')]
#['020-8888888', '010-1234567']


str = 'I have a dog , I have a cat'
res4=re.findall(r'I have a (?:dog|cat)',str)
print(res4)
res5=re.findall(r'I have a dog|cat',str)
print(res5)
# 输出:['I have a dog', 'I have a cat']
# ['I have a dog', 'cat']


str=".8CAT@"
res9=re.findall(r'\b\w+\b',str)
print(res9)
# 输出:['8CAT']

四、re.I、re.S、re.M的用法?

re.I  忽略大小写
re.M  改变^和$的行为,^$默认只能匹配一行的内容,
改变后可以匹配多行
re.S  改变.的行为,使得.能匹配换行

a = 'This is the first line.\nThis is the second line.\nThis is the third line.'
q = re.match(r'This.*line.', a, flags=re.S)
print(q.group(0))
# 输出:This is the first line.
# This is the second line.
# This is the third line.

a = 'This is the first line.\nThis is the second line.\nThis is the third line.'
print(re.findall(r'^This.*line.$', a,flags=re.M))
# 输出:
# ['This is the first line.', 'This is the second line.', 'This is the third line.']

五、finditer、sub、split如何使用?

res3 = re.finditer(r'\d+','aa123bb456cc')  #返回Match对象的一个迭代器

content = "123abc456"
new_content = re.sub(r'\d+', '#', content)
print(new_content)
res10 = re.split(r'\d+','one1two2three3four4')
print(res10)
# 输出:#abc#
# ['one', 'two', 'three', 'four', '']

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript正则表达式和Java正则表达式在语法上有一些差异,但是它们的基本概念和用法是相似的。下面是将JavaScript正则表达式转换为Java正则表达式的一些常见规则: 1. 语法差异: - JavaScript正则表达式使用斜杠(/)作为定界符,而Java正则表达式使用双引号(")作为定界符。 - JavaScript正则表达式中的特殊字符需要进行转义,而Java正则表达式中的特殊字符不需要转义。 2. 字符类: - JavaScript正则表达式中的字符类使用方括号([])表示,而Java正则表达式中使用方括号([])或者Unicode转义(\p{...})表示。 - JavaScript正则表达式中的字符类可以使用连字符(-)表示范围,而Java正则表达式中需要使用Unicode转义(\uXXXX)表示范围。 3. 量词: - JavaScript正则表达式中的量词使用花括号({})表示,而Java正则表达式中使用花括号({})或者问号(?)表示。 - JavaScript正则表达式中的贪婪量词默认是贪婪模式,而Java正则表达式中的贪婪量词需要在后面添加问号(?)来表示非贪婪模式。 4. 边界匹配: - JavaScript正则表达式中的边界匹配使用插入符号(^)和美元符号($)表示,而Java正则表达式中使用\A和\Z表示。 5. 其他差异: - JavaScript正则表达式中的捕获组使用圆括号(())表示,而Java正则表达式中使用圆括号(())或者方括号([])表示。 - JavaScript正则表达式中的反向引用使用反斜杠加数字(\1、\2等)表示,而Java正则表达式中使用美元符号加数字($1、$2等)表示。 以上是一些常见的JavaScript正则表达式转换为Java正则表达式的规则。具体转换时,还需要根据具体的正则表达式进行适当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值