Python3正则表达式-创新互联

Python3 正则表达式

  • 正则表达式是一个特殊的字符序列,它能帮助我们方便的检查一个字符串是否与某种模式匹配。
  • 模式字符串使用特殊的语法来表示一个正则表达式
  • 下面列出了正则表达式模式语法中的特殊元素
模 式 含义
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*匹配0个或多个的表达式。
re+匹配1个或多个的表达式。
re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。
re{ n,}匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。
re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a|b匹配a或b\n
(re)匹配括号内的表达式,也表示一个组
(?imx)正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx)正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re)类似 (...), 但是不表示一个组
(?imx: re)在括号中使用i, m, 或 x 可选标志
(?-imx: re)在括号中不使用i, m, 或 x 可选标志
(?#...)注释.
(?= re)前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re)前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re)匹配的独立模式,省去回溯。
\w匹配字母数字及下
\W匹配非字母数字及下划线
\s匹配任意空白字符,等价于 [\t\n\r\f].
\S匹配任意非空字符
\d匹配任意数字,等价于 [0-9].
\D匹配任意非数字
\A匹配字符串开始
\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z匹配字符串结束
\G匹配最后匹配完成的位置。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等.匹配一个换行符。匹配一个制表符。等
\1...\9匹配第n个分组的内容。
\10匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

match()和search()的区别

  • match() 方法只从开始找,开始第一个字符不匹配就找不到了,返回none
  • search()查找整个字符串,找到第一个为止
    示例代码1:
#!/usr/bin/python3

import re

# 使用 match对象  
match = re.match('yhyang','aayhyang正在学习正则表达式')
print(match)     # 最开始匹配不到返回none
输出:
None

match = re.search('yhyang','aayhyang正在学习正则表达式')
print(match.group())  # 直到找到匹配的字符串
输出:
yhyang

示例代码2:

创新互联长期为成百上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为太和企业提供专业的网站建设、成都网站建设太和网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。
#!/usr/bin/python3

import re

import re
s = """
1234-1234-113
133-1234-2123
125-4567-3456
yhyang@foxmail.com
lilei@qq.com
hmm.lee@google.com
http://baidu.com
https://github.com
http://taobao.com
"""
target = '\d{4}'                 # \d 匹配数字 {4} 表示4个  代表找到4个数字
target = '\d{4}-\d{4}-\d{3}'
target = '\d{3}-\d{4}-\d{4}'
target = '\d+-\d+-\d+'         #  \d匹配数字,+ 表示1个或多个,search 找到第一个就停下来了
target = '[\d+-?]+'           # ? 表示后面跟0个或多个   [] 表示一个字符集如:[a-z]查找小写字母
target = '\w{5}@\w{2}.com'    #  \w 匹配字符
match = re.search(target,s)
if match:
    print('找到,',target,s)
    print(match.group())
else:
    print('啥都没找到')

输出:
找到, \w{5}@\w{2}.com 
1234-1234-113
133-1234-2123
125-4567-3456
yhyang@foxmail.com
lilei@qq.com
hmm.lee@google.com
http://baidu.com
https://github.com
http://taobao.com

lilei@qq.com

分组

  • () 括号分组
  • | 管道符号匹配多个分组
  • ?选择出现0次或1次
  • re.x 换行,注释
  • findall
    • 有分组,返回元组列表
    • 无分组,返回字符串列表
  • split
    • 返回用正则分割后的列表

compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
语法格式为:
re.compile(pattern[, flags])

参数:

pattern : 一个字符串形式的正则表达式
flags 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
    re.I 忽略大小写
    re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
    re.M 多行模式
    re.S 即为' . '并且包括换行符在内的任意字符(' . '不包括换行符)
    re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
    re.X 为了增加可读性,忽略空格和' # '后面的注释

示例代码1:

#!/usr/bin/python3

import re

regex = re.compile(r'yhyang')  # r 表示raw 原始的
regex.findall('asdfasdfasfyhyang,235346747,yhyang')

输出:
['yhyang', 'yhyang']

示例代码2:

#!/usr/bin/python3

import re

regex = re.compile(r'(yhyang)')         # ()  分割,分组
regex.split('asdfasdfasfyhyang,235346747,yhyang')

输出:
['asdfasdfasf', 'yhyang', ',235346747,', 'yhyang', '']

匹配IP地址

#!/usr/bin/python3
import re

parten = ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
# 2[0-4]\d  匹配 24x  x为0-9
# 25[0-5]  匹配 25x  x为0-5
# [01]?\d\d?  [01]? 匹配0个或是一个0或1,\d? 表示0个或1个数字
# \.  转义 . 
# {3} 前面的规则匹配3次

# 注意命名 re开头
re_ip = re.compile(r'((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)')
match = re_ip.match('1.2.3.4')
print(match)
print(match.group())

输出:
<_sre.SRE_Match object; span=(0, 7), match='1.2.3.4'>
1.2.3.4
示例代码2:

#!/usr/bin/python3

import re

re_ip = re.compile(r'''
    ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.)  # IP表示一组数字包括后边的点
    {3}                                # 表示3组数字
    (2[0-4]\d|25[0-5]|[01]?\d\d?)      # 最后一组数字
    ''',re.X)                          # 正则可以换行,注释
match = re_ip.match('192.168.3.4')
print(match)
print(match.group())

输出:
<_sre.SRE_Match object; span=(0, 11), match='192.168.3.4'>
192.168.3.4

匹配要不要贪心一点

模式 含义 示例
{m,n}?对于前一个字符重复m到n次,并取尽可能少的情况在字符串‘aaaaaa’中,a{2,4}会匹配4个a,但a{2,4}?只会匹配2个a
.*与?的搭配默认贪心,有多少要多少,?给加上限制,表示非贪心匹配,?把*匹配的字符限制到最少r'"(.)"'与 r'"(.?)"'
  • *?重复任意次,但尽可能少重复
  • +?重复1次或多次,但尽可能少重复
  • ??重复0次或1次,但尽可能少重复
  • {n,}?重复n次以上,但尽可能少重复
    示例代码1:
#!/usr/bin/python3

import re

# 只匹配双引号中的内容,包括双引号
re_quote = re.compile(r'"(.*)"')
text1 = 'Computer says "no"'
find1 = re_quote.findall(text1)
print(find1)
text2 = 'Computer says "no" Phone says "yes"'
find2 = re_quote.findall(text2)
print(find2)

输出:
['no']
['no" Phone says "yes']

示例代码2:

#!/usr/bin/python3

import re

re_quote = re.compile(r'"(.*?)"')
text1 = 'Computer says "no"'
find1 = re_quote.findall(text1)
print(find1)
text2 = 'Computer says "no" Phone says "yes"'
find2 = re_quote.findall(text2)
print(find2)

输出:
['no']
['no', 'yes']

正则替换

示例代码:

#!/usr/bin/python3

import re

s = 'sadfasfasdfasdfyhyangdsafasf2352'
ss = s.replace('yhyang','******')   # 替换
print(ss)

regex = re.compile(r'yhyang') # 生成规则对象
regex.sub('******',s)   # 替换

输出:
sadfasfasdfasdf**dsafasf2352
'sadfasfasdfasdf**dsafasf2352'

下边例子分组标号\1,\2,\3 类似于awk的列分组 $1 ……

示例代码1:

#!/usr/bin/python3

import re

# 通过分组替换字符串格式,mm/dd/yy  -> yy-mm-dd
s = '替换日期格式:10/01/2018,12/25/2018'
re_date = re.compile(r'(\d+)/(\d+)/(\d+)')  # 此处给(\d+)/(\d+)/(\d+)按/分为三组,标号为\1,\2,\3
re_date.sub(r'\3-\1-\2',s)   # 将上边的\1,\2,\3位置按要求重新排列

输出:
'替换日期格式:2018-10-01,2018-12-25'
示例代码2:

#!/usr/bin/python3

import re

# 替换字符串中间的多余空格
s = '      yhyang    正则   python  好难学, 坚持一下吧, 没 几  个了'
s.strip()  # 只去掉最前边的
re_blank = re.compile(r'\s+') # \s 代表空格
re_blank.sub('',s)

输出:
'yhyang正则python好难学,坚持一下吧,没几个了'

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻标题:Python3正则表达式-创新互联
地址分享:http://csdahua.cn/article/cecddd.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流