正则表达式

收藏链接

import re

s1 = "python123"
s2 = "python12
"
r2 = re.findall('[a-z1-9]',s1)
r1 = re.findall(u'.',s1)   ##  . 匹配所有的字符
print(r2)

pattern = re.match("y.h",s1)

## 提取结构化文本
```python
import re
import pandas as pd
regex = r"(.*)[考|进].*了(.*)"
test_str = ("张华考上了北京大学
"
	"李萍进了中等技术学校
"
	"韩梅梅进了百货公司")
mylist = []
print(test_str)
for line in test_str.split('
'):
  mysearch = re.search(regex, line)
  if mysearch:
    name = mysearch.group(1)
    dest = mysearch.group(2)
    mylist.append((name, dest))

df = pd.DataFrame(mylist)
df.columns = ['姓名', '去向']
df.to_excel("dest.xlsx", index=False)

判断如果一个句子中英文或数字个数如果大于两个就判定为坏句子

def good_line(line):
if len(re.findall('[a-zA-Z0-9]',''.join(line)))>2:
return False

return True

print(pattern)


# 常用正则表达式

## ab+c,可以匹配 abc、abbc、abbbbc 等,+ 号代表前面的字符必须至少出现一次
# (1次或多次)


```python
str1 = "1abbbbc2432"

str2 = "ab+c"
result = re.match(str2,str1)

result.group()

a*b,可以匹配 b、ab、aaaaaaab 等,星 号代表字符可以不出现,也可以出现一次或者多次

(0次、或1次、或多次)。

colou?r 可以匹配 color 或者 colour, 问号代表前面的字符最多只可以出现一次

(0次、或1次)。

  • compile() 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换
import re

src="3.12,3.45,66.4,56234,2355.523525,235,dgads"

pattern=re.compile('d+.d+')
result=pattern.findall(src)

print(result)
['3.12', '3.45', '66.4', '2355.523525']

match()函数必须在起始位置进行匹配

import re
print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.match('com', 'www.runoob.com'))   
(0, 3)
None

当要获得整个匹配成功的字串时, 使用group或group(0)

import re

pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   # re.I 表示忽略大小写
m = pattern.match('Hello World Wide Web')

m.group(0)    

import re

m = re.search('run[a-z]+b', 'www.runoob.com')
if m:
    print(m.group())
    print(m.span())
'Hello World'

上面的 match 和 search 方法都是一次匹配,只要找到了一个匹配的结果就返回。然而,在大多数时候,我们需要搜索整个字符串,获得所有匹配的结果。

findall()默认返回的是一个list

import re
# pattern = re.compile('d+')   # 查找数字
result1 = re.findall('d+','hello 123456 789')
# result2 = pattern.findall('one1two2three3four4', 0, 10)
print(result1[1])

789

正则表达式除了提取信息,我们有时候还需要借助于它来修改文本,比如我们想要把一串文本中的所有数字都去掉,可以使用sub()方法

import re

content = '54aK54yr5oiR54ix5L2g'
content = re.sub('d+', 'lala', content)## 第一个参数为要匹配的字符,第二个参数为要替换成的字符
print(content)
lalaaKlalayrlalaoiRlalaixlalaLlalag

正则表达式的复用

import re

content1 = '2016-12-15 12:00'
content2 = '2016-12-17 12:55'
content3 = '2016-12-22 13:21'
pattern = re.compile('d{2}:d{2}')
result1 = pattern.sub( '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3)
2016-12-15  2016-12-17  2016-12-22 

模式描述
w匹配字母数字及下划线
W匹配非字母数字及下划线
s匹配任意空白字符,等价于 [ f].
S匹配任意非空字符
d匹配任意数字,等价于 [0-9]
D匹配任意非数字
A匹配字符串开始
匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
z匹配字符串结束
G匹配最后匹配完成的位置
匹配一个换行符
匹配一个制表符
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[...]不在[]中的字符:[abc] 匹配除了a,b,c之外的字符。
*匹配0个或多个的表达式。
+匹配1个或多个的表达式。
?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n}精确匹配n个前面表达式。
{n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a|b匹配a或b
( )匹配括号内的表达式,也表示一个组

原生字符串 是由r开头的字符串,其不包含转义符 就是 不起作用
string 字符串中将理解为转义符
r = 12

r = 'niz dcndi'

print(r)

b = u'nidd /t didc'

print(b)

贪婪匹配 最小匹配

import re 
match = re.search(r'PY.*N','PYANBNCNDN')
match.group(0)   ##默认贪婪匹配
import re 
match = re.search(r'PY.*?N','PYANBNCNDN')
match.group(0)   ##添加问号获得最小匹配
import re 
match = re.search(r'"python','"pythonhaha"')
match.group(0)
原文地址:https://www.cnblogs.com/rise0111/p/11563754.html