标签分类
技术文章
当前位置:主页 > 计算机编程 > python > python re.sub 正则表达式过滤指定字符

python re正则匹配过滤指定字符串

  • 发布时间:
  • 作者:码农之家原创
  • 点击:63

python re.sub 正则表达式过滤指定字符

这篇文章主要知识点是关于python,re,正则,匹配,过滤,字符串,python re.sub 正则表达式过滤指定字符,python中re模块与正则表达式的介绍(附代码) 详解Python正则表达式re模块 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Python数据抓取技术与实战
  • 类型:Python大小:59.3 MB格式:PDF出版:电子工业出版社作者:潘庆和,赵星驰
立即下载

实例代码

re.sub(pattern, repl, string, count=0, flags=0)
Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl. If the pattern isn’t found, string is returned unchanged. repl can be a string or a function; if it is a string, any backslash escapes in it are processed. That is, \n is converted to a single newline character, \r is converted to a carriage return, and so forth. Unknown escapes such as \j are left alone. Backreferences, such as \6, are replaced with the substring matched by group 6 in the pattern. For example:

>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
...        r'static PyObject*\npy_\1(void)\n{',
...        'def myfunc():')
'static PyObject*\npy_myfunc(void)\n{'
If repl is a function, it is called for every non-overlapping occurrence of pattern. The function takes a single match object argument, and returns the replacement string. For example:

>>> def dashrepl(matchobj):
...     if matchobj.group(0) == '-': return ' '
...     else: return '-'
>>> re.sub('-{1,2}', dashrepl, 'pro----gram-files')
'pro--gram files'
>>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE)
'Baked Beans & Spam'
The pattern may be a string or an RE object.

The optional argument count is the maximum number of pattern occurrences to be replaced; countmust be a non-negative integer. If omitted or zero, all occurrences will be replaced. Empty matches for the pattern are replaced only when not adjacent to a previous match, so sub('x*', '-', 'abc') returns '-a-b-c-'.

In addition to character escapes and backreferences as described above, \g<name> will use the substring matched by the group named name, as defined by the (?P<name>...) syntax. \g<number>uses the corresponding group number; \g<2> is therefore equivalent to \2, but isn’t ambiguous in a replacement such as \g<2>0. \20 would be interpreted as a reference to group 20, not a reference to group 2 followed by the literal character '0'. The backreference \g<0> substitutes in the entire substring matched by the RE.

Changed in version 2.7: Added the optional flags argument.

简单来说,pattern 就是一个需要被替换的正则表达式,当其匹配成功后,就会用 repl 进行替换,而 string 就是需要被替换的字符串。

比如,我们需要对一个字符串进行处理,首先需要删除括号内所有内容,包括括号,其次,删除空格,然后按照逗号将其进行分割

s = '物流 企业, 生产效率, 数据包络分析(DEA),Window Analysis,'
r1 = re.compile('[((].*?[))]|\s|,$')
# [((] 匹配英文(  或者中文(
# [((]\w*?[))] 匹配以中文括号或者英文括号括起来的 \w*?
# \w*? 匹配字母、数字、下划线,重复任意次,尽可能少重复
# | 逻辑或
# \s 任意空白符
# ,$ 从最后开始的一个逗号
s1 = re.sub(r1,'',s)   # 对于正则表达式进行 '' 替换,等效于删除正则表达式可以匹配的内容
# 按照逗号分割
s2 = s1.split(',')   # 按照逗号将其分割
for x in s2:
    print x

 

python中re模块与正则表达式的介绍(附代码)

本篇文章给大家带来的内容是关于python中re模块与正则表达式的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

正则表达式规则,单字符匹配

字符功能正则表达式示例符合匹配示例
.匹配任意一个字符(除了n)b.bbab,b2b
[ ]匹配来自[]中字符集的任意一个字符i [abCde]mi am
\d匹配任何十进制数字,与[0-9]一致w\dcschoolw3cschool
\D匹配非数字,即不是数字mou\Dhmouth
\s匹配任何空格字符,与[\n\t\r\v\f]相同i\slikei like
\S匹配任何非空白字符,与\s相反n\Senoe,n3e
\w匹配任何字母数字字符,与[A-Za-z0-9_]相同[A-Za-z]w+
\W匹配非单词字符[0-9]\W[A-Z]3 A

表示数量匹配

字符功能正则表达式示例符合匹配的示例
*匹配0次或者多次前面出现的正则表达式,即可有可无a*aaa
+匹配前一个字符出现1次或者无限次,即至少有一次a+aaa
?匹配前一个字符出现1次或者0次,要么有一次,要么没有a?a或者b
{m}匹配前一个字符出现m次[0-9]{5}12345
{m.}匹配前一个字符至少出现m次a{5.}aaaaa
{m,n}匹配前一个字符出现从m到n次a{2,6}aaa

表示边界匹配

字符功能正则表达式示例
^匹配字符串起始部分^Dear
$匹配字符串终止部分fi$
b匹配任何单词的边界\bThe\b
B匹配非单词边界.*\Bver\

匹配分组

字符功能
\匹配左右任意一个表达式
(ab)将括号中字符作为一个分组
\num引用分组num匹配到的字符串
(?P<name>)分组起别名
(?P=name)引用别名为name分组匹配到的字符串

re模块

在python中,可以使用内置的re模块来使用正则表达式

re模块常见的函数和方法

核心函数说明
compile(pattern,flags=0)使用任何可选的标记来编译正则表达式的模式,然后返回一个正则表达式对象
re模块函数和正则表达式对象方法说明
match(pattern,string,flags=0)尝试使用带有可选的标记的正则表达式的模式来匹配字符串。如果匹配成功,就返回匹配对象; 如果失败,就返回 None
search(pattern,string,flags=0)使用可选标记搜索字符串中第一次出现的正则表达式模式。 如果匹配成功,则返回匹配对象; 如果失败,则返回 None
findall(pattern,string,[,flags])查找字符串中所有出现的正则表达式,并返回一个列表
split(pattern,string,max=0)根据正则表达式的模式分隔符,spilt函数将字符串分割为列表,然后返回成功匹配的列表,分割最多操作max次(默认分割所有匹配成功的位置)
sub(pattern,repl,string,count=0)使用repl替换所有正则表达式的模式在字符串中出现的位置,除非定义count,否则就将替换所有出现的位置
常用的匹配对象方法说明
group(num=0)默认返回整个匹配对象或者返回编号为num的特定子组
groups(default=None)返回一个包含所有匹配子组的元组,如果没有成功匹配,返回一个空元组
span()
常用的模块属性,大多数用于对正则表达式函数的修饰说明
re.I使匹配对大小写不敏感(忽略大小写)
re.S.(点号)匹配除了n之外的所有字符,re.S标记表示.(点号)能够匹配全部字符
re.M多行匹配,影响^和$
re.U根据Unicode字符集解析字符。影响\w,\W,\b和\B
re.X该标志通过给予你更灵活的格式以便你讲正则表达式写得更易于理解

re模块一般的使用方法

  1. 使用 compile() 函数将正则表达式的字符串形式编译为一个正则表达式对象;

  2. 通过正则表达式对象提供的一系列方法(如:match())对文本进行匹配查找,获得匹配结果,一个Match对象;

  3. 最后使用Match对象提供的属性和方法(例如:group())获得信息,根据需要进行其他的操作。

re模块使用示例

导入模块

import re

compile()函数
compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下:

import re

# 将正则表达式编译成pattern对象
pattern = re.compile(r'\d+')

编译成正则表达式对象后,就可以使用上面所说的正则表达式对象方法了。

match()方法
match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。它的一般使用形式如下:

match(string[, pos[, endpos]])

其中,string是待匹配的字符串,pos 和 endpos 是可选参数,指定字符串的起始终点位置,默认值分别是 0 和 len (字符串长度)。因此,当你不指定 pos 和 endpos 时,match 方法默认匹配字符串的头部。

当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。

>>> import re
>>> 
>>> pattern = re.compile(r'\d+') # 正则表达式表示匹配至少一个数字
>>> 
>>> m = pattern.match("one2three4") # match默认从开头开始匹配,开头是字母o,所以没有匹配成功
>>> print(m) # 匹配失败返回None
None
>>> 
>>> m = pattern.match("1two3four") # 开头字符是数字,匹配成功
>>> print(m)
<_sre.SRE_Match object; span=(0, 1), match='1'>
>>> 
>>> m.group() # group()方法获取匹配成功的字符
'1'
>>> m = pattern.match("onetwo3four56",6,12) # 指定match从数字3开始查找,第一个是数字3,匹配成功
>>> print(m)
<_sre.SRE_Match object; span=(6, 7), match='3'>
>>> m.group()
'3'

以上就是python中re模块与正则表达式的介绍(附代码)的详细内容,更多请关注码农之家其它相关文章!

详解Python正则表达式re模块

正则是处理字符串最常用的方法,我们编码中到处可见正则的身影。

正则大同小异,python 中的正则跟其他语言相比略有差异:

1、替换字符串时,替换的字符串可以是一个函数
2、split 函数可以指定分割次数,这会导致有个坑
3、前项界定的表达式必须定长

下面详细描述下 re 模块的使用方法,其实,注意上面提到的三点差异就好

1、match

说明:
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回 None。

语法:
re.match(pattern, string, flags=0)

flags为可选标识,多个标识可以通过按位或 (|) 来指定。如 re.I | re.M 被设置成 I 和 M 标识:

修饰符

描述

re.I

使匹配对大小写不敏感

re.L

做本地化识别(locale-aware)匹配

re.M

多行匹配,影响 ^ 和 $

re.S

使 . 匹配包括换行在内的所有字符

re.U

根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.

re.X

该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

匹配成功re.match方法返回一个匹配的对象,可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。group() 或 group(0),返回整个正则表达式的匹配结果。

举例:

s= 'abc123abc'

print(re.match('[a-z]+', s))           # <_sre.SRE_Match object; span=(0, 3), match='abc'>

print(re.match('[a-z]+', s).group(0))      # abc
print(re.match('[\d]+', s))            # None
print(re.match('[A-Z]+', s, re.I).group(0))   # abc
print(re.match('[a-z]+', s).span())       # (0, 3)

2、search

说明:
re.search 扫描整个字符串并返回第一个成功的匹配。

语法:
re.search(pattern, string, flags=0)

匹配成功re.search方法返回一个匹配的对象,否则返回None。可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

s = 'abc123abc'

print(re.search('[a-z]+', s).group())  # abc
print(re.search('[a-z]+', s).span())   # (0, 3)
print(re.search('[\d]+', s).group())   # 123
print(re.search('[\d]+', s).span())   # (3, 6)
print(re.search('xyz', s))         # None

groupdict
groupdict 返回匹配到的所有命名子组的字典。

print(re.search('[a-z]+', s).groupdict())   # {}

print(re.search('(?P<letter>[a-z]+)(?P<num>\d+)', s).groupdict()) # {'num': '123', 'letter': 'abc'}

3、sub 和 subn

说明:
re.sub用于替换字符串中的匹配项。

re.subn返回一个元组,包含替换后的字符串及替换次数。

语法:
sub(pattern, repl, string, count=0, flags=0)

repl: 替换的字符串,也可为一个函数。

count: 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

举例:

s = 'abc123abc'

print(re.sub('[\d]+', '数字', s))  # abc数字abc
print(re.sub('[a-z]+', '字母', s, 1)) # 字母123abc


# 将匹配的数字乘以 2
def double(matched):
 value = int(matched.group('value'))
 return str(value * 2)


# repl是一个函数
print(re.sub('(?P<value>\d+)', double, s))  # abc246abc
print(re.subn('[\d]+', '数字', s))       # ('abc数字abc', 1)
print(re.subn('[a-z]+', '字母', s,))      # ('字母123字母', 2)
print(re.subn('[a-z]+', '字母', s, 1))     # ('字母123字母', 1)

4、compile

说明:
re.compile 用于编译正则表达式,生成一个正则表达式(Pattern)对象,供 match() 和 search() 这两个函数使用。

语法:
compile(pattern, flags=0)

举例:

s = 'abc123abc'

p = re.compile('[\d]+')

print(p.match(s, 4, 5).group(0)) # 2 从位置4开始匹配到位置5
print(p.search(s).group(0))   # 123

5、findall

说明:
re.findall 在字符串中查找正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

语法:
findall(pattern, string, flags=0)

举例:

s = 'abc123abc'

print(re.findall('[a-z]+', s)) # ['abc', 'abc']
print(re.findall('[h-n]+', s)) # []

6、finditer

说明:
finditer和 findall 类似,在字符串中查找正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

语法:
finditer(pattern, string, flags=0)

举例:

s = 'abc123def'

it = re.finditer('[a-z]+', s)

for match in it:
 print(match.group())

7、split

说明:
re.split 方法按照能够匹配的子串将字符串分割后返回列表。

语法:
split(pattern, string, maxsplit=0, flags=0)

maxsplit:分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。

举例:

print(re.split('a', '1A1a2A3', re.I))   # ['1A1', '2A3']

# 输出结果并未能区分大小写,这是因为re.split(pattern,string,maxsplit, flags)默认是四个参数,当我们传入的三个参数的时候,系统会默认re.I是第三个参数,所以就没起作用。
# 如果想让这里的re.I起作用,写成flags=re.I即可。
print(re.split('a', '1A1a2A3', flags=re.I))  # ['1', '1', '2', '3']

8、escape

说明:
re.escape对字符串里面的特殊字符串进行转义。

语法:
escape(pattern)

举例:

print(re.escape('www.dxy.cn')) # www\.dxy\.cn

9、正则

“(?P<name>…)”:分组,并将其命名为<name>。

“(?P=name)”:引用别名为<name>的分组匹配到的串。

10、前项(否定)界定中的特殊

正则中常用的前项界定(?<=exp)和前项否定界定(?<!exp)在 python 中会报错:look-behind requires fixed-width pattern,原因是 python 中前项界定的表达式必须是定长的,例如

(?<=aaa)   # 正确

(?<=aaa|bbb) # 正确

(?<=aaa|bb) # 错误

(?<=\d+)   # 错误

(?<=\d{3})  # 正确

以上所述是小编给大家介绍的Python正则表达式re模块详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到等python文章进一步学习,感谢大家的阅读和支持。

上一篇:python dataframe均值填充知识点详解

下一篇:Python中Opencv用cuda加速方法实例

展开 +

收起 -

学习笔记
网友NO.159793

python re正则匹配网页中图片url地址的方法

最近写了个python抓取必应搜索首页http://cn.bing.com/的背景图片并将此图片更换为我的电脑桌面的程序,在正则匹配图片url时遇到了匹配失败问题。 要抓取的图片地址如图所示: 首先,使用这个pattern reg = re.compile('.*g_img={url: "(http.*?jpg)"') 无论怎么匹配都匹配不到,后来把网页源码抓下来放在notepad++中查看,并用notepad++的正则匹配查找,很轻易就匹配到了,如图: 后来我写了个测试代码,把图片地址在的那一行保存在一个字符串中,很快就匹配到了,如下面代码所示,data是匹配不到的,然而line是可以匹配到的。 # -*-coding:utf-8-*-import osimport re f = open('bing.html','r') line = r'''Bnp.Internal.Close(0,0,60056); } });;g_img={url: "https://az12410.vo.msecnd.net/homepage/app/2016hw/BingHalloween_BkgImg.jpg",id:'bgDiv',d:'200',cN'''data = f.read().decode('utf-8','ignore').encode('gbk','ignore') print " " reg = re.compile('.*g_img={url: "(http.*?jpg)"') if re.match(reg, data): m1 = reg.findall(data) print m1[0]else: print("data Not match .") print 20*'-'#print lineif re.match(reg, line): m2 = reg.findall(line) print m2[0]else: print("line Not match .") 由此可见line和data是有区别的,什么区别呢?那就是data是多行的,包含换行符,而line是单行的,没有换行符。我有在字符串line中加了换行符,结果line没有匹配到。 到这了原因就清楚了。原因就在这句话 ……

网友NO.104394

详解Python正则表达式re模块

正则是处理字符串最常用的方法,我们编码中到处可见正则的身影。 正则大同小异,python 中的正则跟其他语言相比略有差异: 1、替换字符串时,替换的字符串可以是一个函数 2、split 函数可以指定分割次数,这会导致有个坑 3、前项界定的表达式必须定长 下面详细描述下 re 模块的使用方法,其实,注意上面提到的三点差异就好 1、match 说明: re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回 None。 语法: re.match(pattern, string, flags=0) flags为可选标识,多个标识可以通过按位或 (|) 来指定。如 re.I | re.M 被设置成 I 和 M 标识: 修饰符 描述 re.I 使匹配对大小写不敏感 re.L 做本地化识别(locale-aware)匹配 re.M 多行匹配,影响 ^ 和 $ re.S 使 . 匹配包括换行在内的所有字符 re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 匹配成功re.match方法返回一个匹配的对象,可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。group() 或 group(0),返回整个正则表达式的匹配结果。 举例: s= 'abc123abc'print(re.match('[a-z]+', s)) # _sre.SRE_Match object; span=(0, 3), match='abc'print(re.match('[a-z]+', s).group(0)) # abcprint(re.match('[\d]+', s)) # N……

网友NO.961218

python中redis查看剩余过期时间及用正则通配符批量删除key的方法

具体代码如下所示: # -*- coding: utf-8 -*-import redisimport datetime'''# 1. redis设置过期时间的两种方式expire函数设置过期时间为10秒。10秒后,ex1将会失效expireat设置一个具体的时间,15年9月8日15点19分10秒,过了这个时间,ex2将失效如果设置过期时间成功会返回True,反之返回False'''pool = redis.ConnectionPool(host='192.168.3.128', port=6379, db=0)r = redis.StrictRedis(connection_pool=pool)extime = datetime.datetime(2018, 7, 25, 15, 19, 10)print r.expire('ex1', 10)print extime.strftime('%Y-%m-%d %H:%M:%S %f')print r.expireat('ex2', extime) # 可指定datetime和时间戳'''2. 查看剩余过期时间(秒)'''print r.ttl('ex1')print r.ttl('ex2')print r.pttl('ex1') # 毫秒'''3. redis批量删除(通配符)'''print r.delete(*r.keys('/vender*')) # 删除 /vender开头的所有namedef main(): passif __name__ == '__main__': main() 总结 以上所述是小编给大家介绍的python中redis查看剩余过期时间及用正则通配符批量删除key的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持! ……

网友NO.172729

python中正则表达式 re.findall 用法

Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。 re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。 本文主要给大家介绍python中正则表达式 re.findall 用法,具体内容如下所示; 在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配。 其中,re.findall() 函数可以遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。 在python源代码中,展示如下: 搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。 def findall(pattern, string, flags=0): 第一个参数,正则表达式 第二个参数,搜索的是那些字符串 第三个参数,匹配的模式,其中re.S使匹配包括换行在内的所有字符。findall()函数是逐行匹配的。 返回string中所有与pattern相匹配的全部字串,返回形式为数组 如果想要使用re.findall函……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明