def clean_text(text):
    if not isinstance(text,str):
        return ''
    # 1. 去除微博超话标签 #xxx#
    text = re.sub(r'#[^#]+#', '', text)
    # 2. 去除URL链接
    text = re.sub(r'http[s]?://\S+', '', text)
    # 3. 去除 @用户名
    text = re.sub(r'@\w+', '', text)
    # 4. 去除HTML标签 {IMG:数字}
    text = re.sub(r'\{IMG:\d+\}', '', text)
    # 5. 去除特殊字符和多余空格
    text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9]', ' ', text)
    text = re.sub(r'\s+', ' ', text).strip()
    return text

r:Python 中字符串的前导r代表原始字符串标识符,该字符串中的特殊符号不会被转义,适用于正则表达式中繁杂的特殊符号表示。

re.match(pattern,string,flags=0)

从字符串的起始位置开始匹配一个模式

result=re.match('itcast','itcast.cn')
result.group()

result.group()是 Python 正则表达式(re模块)中用于获取匹配结果内容的方法。

group() 同group(0)就是匹配正则表达式整体结果,group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分

字符

功能

位置

.

匹配除了\n之外的任意一个字符

[]

匹配其中任意一个字符

\d

匹配数字,0-9

[。。。]中

\D

匹配非数字

[。。。]中

\s

匹配空白

[。。。]中

\S

匹配非空白

[。。。]中

\w

[a-zA-Z0-9_] 字母,数字,下划线

[。。。]中

\W

匹配非w字符

[。。。]中

字符集中的字符可以逐个列出,也可以给出范围,比如[abc]和[a-c],第一个字符如果是^表示取反

ret=re.match('[hH]','hello python')
print(ret.group())

字符

功能

位置

表达式实例

完整匹配的字符串

*

匹配前一个字符出现0次或无限次

用在字符或(...)之后

(...)表示一个组合,匹配这个组合0次或无限次

abc*

abccc

+

匹配前一个字符出现1次或无限次

用在字符或(...)之后

abc+

abccc

匹配前一个字符出现0次或1次

用在字符或(...)之后

abc?

ab

{m}

匹配前一个字符出现m次

用在字符或(...)之后

ab{2}c

abbc

{m,n}

匹配前一个字符出现m到n次,若省略m,则匹配0-n次,若省略n,则匹配m到无限次;尽可能匹配最多的字符(贪婪匹配)

用在字符或(...)之后

ab{1,2}c

abc,abbc

ret=re.match('[A-Z][a-z]*','M')
print(ret.group())
# 匹配以大写字母开头,后面跟0个或无限个小写字母的字符串

ret=re.match('[a-zA-Z_]+[\w]*',name)
print(ret.group())
# 以字母(大小写均可)或下划线开头,后面可以跟任意数量(包括零个)的字母、数字或下划线。

ret=re.match('[1-9]?[0-9]','7')
#匹配出0-99之间的数字
#如果意图是验证完整数字,必须用 re.fullmatch() 或锚定边界(^$)

ret=re.match('[a-zA-Z0-9_]{6}','12a3g45678')
# 12a3g4
ret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66")
# 1ad12f23s34455ff66

字符

功能

^

匹配字符串开头

  • 开头是 ^→ 匹配行首
  • 中括号里首字符是 ^→ 取反

$

匹配字符串结尾

ret=re.match('[\w]{4,20}@163\.com$',email)

字符

功能

|

匹配左右任意一个表达式

(ab)

将括号中字符作为一个分组

\num

引用分组num匹配到的字符串

(?P<name>)

分组起别名,匹配到的子串组在外部是通过定义的name来获取的

(?P=name)

引用别名为name分组匹配到的字符串

pattern=r'(?:100|[1-9]\d?|0)'
ret=re.fullmatch(pattern,s) #匹配0-100之间的数字
# 当你 只需要逻辑分组,不需要提取内容 时,推荐使用 (?:...)
例子1:匹配出 <html>hh</html>
ret=re.match(r'<([a-zA-Z]*)>\w*</\1>','<html>hh</html>')
\1匹配第一个分组的内容
举例:(?P<name>) (?P=name)

一个用于标记,一个用于在同一个正则表达式中复用
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>","<html><h1>www.itcast.cn</h1></html>")

re.compile

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

prog=re.compile(pattern)
result=prog.match(string)

re.search

re.search 扫描整个字符串并返回第一个成功的匹配,如果没有匹配,就返回一个None

ret=re.search(r'\d+','阅读次数为9999')

re.findall

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

match and search only find once, findall find all

ret=re.findall(r'\d+','python=9999,c=7890,c++=12345')

re.finditer

similar to findall, finditer find all matching substrs, and return a iterator

it=re.finditer(r'\d+','12a32bc43jf3')
for match in it:
    print(match.group())

re.sub

re.sub(pattern,repl,string,count=0,flags=0)

ret=re.sub(r'\d+','998','python=997')

python=998

re.split

re.split(pattern,string,maxsplit=0,flags=0)

ret=re.split(r':| ','info:xiaozhang 33 shandong')
print(ret)

['info','xiaozhang','33','shandong']

在"*","?","+","{m,n}"后⾯加上?,使贪婪变成⾮贪婪。

断言(?=...)不消耗字符,只做“检查”,所以多个断言可以叠加使用。

正向先行断言 (?=)

\d+(?=PM) 只匹配后面有PM的数值

后向先行断言(?!)

\d+(?!PM) 只匹配后面没有PM的数值

正向后行断言(?<=)

(?<=\$)\d+只匹配前面带有$的数字

负向后行断言(?<!)

(?<!\$)\d+ 只匹配前面没有$的数字

有特殊意义的符号要用转义符号\

匹配至少8位且包含大小写字母和数字的密码

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{8,}$

匹配超大金额

^\$([1-9] quadrillion)|([1-9]\d{0,2}(,\d{3}){0,5})$

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐