【python小知识】re正则
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 |
|
[。。。]中 |
|
\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})$
更多推荐



所有评论(0)