以某个字符开始、某个字符结束,期待的提取结果包含首末字符串
提取公式:a = re.findall(“开始字符串.*末字符串”,str)
以某个字符开始、某个字符结束,期待的提取结果不包含末字符串,但包含首字符串
提取公式:a = re.findall("开始字符串.*?(?=末字符串)",str)time = re.findall("202.*?(?=,)",content) # 也就是提取以202开头的,逗号结束的,且不包括逗号的
以某个字符开始、某个字符结束,期待的提取结果不包含首字符串,但包含末字符串:
提取公式:a = re.findall("(?<=开始字符串).*末字符串",str)
以某个字符开始、某个字符结束,期待的提取结果不包含首、末字符串:
提取公式1:a = re.findall("(?<=开始字符串).*?(?=末字符串)",str)提取公式2:a = re.findall(".*开始字符串(.*)末字符串*",str)micro_step = re.findall("(?<=micro_step=).*?(?=/global_step)", content) # case4 方法1micro_step = re.findall(".*micro_step=(.*)/global_step*", content) # case4方法2
起始字符串不固定(即从首字符串提取到固定的字符串结束),用^指定从首字符串开始
提取公式:a = re.findall('^.*结束字符串',str)
特殊字符-需要转义
$ :匹配字符串的结尾。 示例:World$ 可以匹配以 “World” 结尾的字符串
() :定义一个分组,用于对模式进行分组和捕获。 示例:(ab)+ 可以匹配 “ab”、“abab”、“ababab” 等。
* :匹配前面的元素零次或多次 示例:ab*c 可以匹配 “ac”、“abc”、“abbc”、“abbbc” 等
+ :匹配前面的元素一次或多次。 示例:ab+c 可以匹配 “abc”、“abbc”、“abbbc” 等,但不匹配 “ac”。
. :匹配除换行符外的任意**一个**字符。 示例:a.b 可以匹配 “aab”、“axb”、“a@b” 等
[ ] :定义**一个**字符类,匹配其中任意一个字符。 示例:[aeiou] 可以匹配任意一个小写元音字母
? :匹配前面的元素零次或一次。 示例:ab?c 可以匹配 “ac”、“abc”,但不匹配 “abbc”
\ :转义
^ :匹配字符串的开头。 示例:^Hello 可以匹配以 “Hello” 开头的字符串
{} :定义重复次数的范围。 示例:a{2,4} 可以匹配 “aa”、“aaa”、“aaaa”,但不匹配 “a” 或 “aaaaa”
| :在两个模式之间进行选择,匹配其中一个。 示例:cat|dog 可以匹配 “cat” 或 “dog”
\b:匹配单词边界,即字符前后不是字母、数字或下划线。 示例:\bword\b 可以匹配 “word”,但不匹配 “words” 或 “sword”。
\d:匹配任意**一个**数字字符,相当于[0-9]。 示例:\d{3} 可以匹配三位数字。
\w:匹配任意**一个**字母、数字或下划线字符,相当于[a-zA-Z0-9_]。示例:\w+ 可以匹配一个或多个字母、数字或下划线字符。
\s:匹配任意**一个**空白字符,包括空格、制表符、换行符等。 示例:Hello\sWorld 可以匹配 “Hello World” 或 “Hello\tWorld”。
python正则表达式取中间字符串
单个位置的字符串提取使用(.+?)
import restr = "a123b"print(re.findall(r"a(.+?)b",str))#输出['123']
贪婪和非贪婪匹配
import restr = "a123b456b"
print(re.findall(r"a(.+?)b", str))
#输出['123']#?控制只匹配0或1个,所以只会输出和最近的b之间的匹配情况
print(re.findall(r"a(.+)b", str))#输出['123b456']
print(re.findall(r"a(.*)b", str))#输出['123b456']
多行匹配
如果你要多行匹配,那么需要加上re.S和re.M标志. 加上re.S后, .将会匹配换行符,默认.不会匹配换行符. 代码如下
str = "a23b\na34b"
re.findall(r"a(\d+)b.+a(\d+)b", str)
#输出[]
#因为不能处理str中间有\n换行的情况
re.findall(r"a(\d+)b.+a(\d+)b", str, re.S)
#s输出[('23', '34')]
连续多个位置的字符串提取
这种情况我们可以使用(?P…)这个正则表达式来提取
有一行webserver的access日志:‘192.168.0.1 25/Oct/2012:14:46:34 “GET /api HTTP/1.1” 200 44 “http://abc.com/search” “Mozilla/5.0”’,我们想提取这行日志里面所有的内容,可以写多个(?Pexpr)来提取,其中name可以更改为你为该位置字符串命名的变量,expr改成提取位置的正则即可
import re
line ='192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search"
"Mozilla/5.0"'
reg = re.compile('^(?P<remote_ip>[^ ]*) (?P<date>[^ ]*) "(?P<request>[^"]*)"
(?P<status>[^ ]*) (?P<size>[^ ]*) "(?P<referrer>[^"]*)" "(?P<user_agent>[^"]*)"')
regMatch = reg.match(line)
linebits = regMatch.groupdict()
print(linebits)
for k, v in linebits.items() :print(k+": "+v)
用正则表达式提取字符串中的整数
import re
re.findall("\d+","asd1234")
pattern2 = r"<div>.*?</div>"
matches2 = re.findall(pattern2, text)
print("\n非贪婪匹配结果:")
for match in matches2:print(match)
import retext = "Check out these websites: http://www.example.com, https://www.google.com, www.yahoo.com"# 匹配网址
url_pattern = r"(http|https)://([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})"
urls = re.findall(url_pattern, text)
for url in urls:full_url = url[0] + "://" + url[1]print(full_url)
使用sub函数进行替换
re.sub(pattern, repl, string, count=0, flags=0):在字符串中查找匹配正则表达式的部分,并进行替换。
import repattern = r"apple"
string = "I have an apple."
new_string = re.sub(pattern, "orange", string)
print(new_string)
## 常用的正则表达式
匹配数字:^\d+$ 可以匹配一个或多个数字。
匹配字母:^[a-zA-Z]+$ 可以匹配一个或多个字母。
匹配数字和字母:^[a-zA-Z0-9]+$ 可以匹配一个或多个数字和字母的组合。
匹配邮箱地址:^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 可以匹配常见的邮箱地址格式。
匹配URL:^(https?|ftp)://[^\s/$.?#].[^\s]*$ 可以匹配常见的URL格式。
匹配手机号码:^1[3456789]\d{9}$ 可以匹配中国大陆的手机号码格式。
匹配日期(YYYY-MM-DD):^\d{4}-\d{2}-\d{2}$ 可以匹配YYYY-MM-DD格式的日期。
匹配时间(HH:MM):^([01]\d|2[0-3]):[0-5]\d$ 可以匹配24小时制的时间格式。
匹配IP地址:^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$ 可以匹配IPv4地址。
匹配HTML标签:<(\w+)>(.*)<\/\1> 可以匹配简单的HTML标签,如<p>...</p>。
匹配邮政编码:^[1-9]\d{5}$ 可以匹配6位数字的邮政编码。
匹配身份证号码:^\d{17}[\dXx]$ 可以匹配18位数字或17位数字加一个大写字母X(校验位)的身份证号码。
匹配电话号码(包括区号):^(\d{3,4}-)?\d{7,8}$ 可以匹配带有可选区号的固定电话号码。
匹配用户名:^[a-zA-Z0-9_-]{3,16}$ 可以匹配长度为3到16个字符的用户名,允许字母、数字、下划线和减号。
匹配整数:^-?\d+$ 可以匹配正整数或负整数。
匹配浮点数:^-?\d+(\.\d+)?$ 可以匹配正浮点数或负浮点数。
匹配文件路径(Windows):^[A-Za-z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$ 可以匹配Windows文件路径,如C:\folder\file.txt。
匹配中文字符:[\u4e00-\u9fa5] 可以匹配任意一个中文字符。
匹配空白行:^\s*$ 可以匹配只包含空白字符的行。
匹配HTML标签(非贪婪模式):<.*?> 可以匹配HTML标签,但是在遇到第一个闭合的尖括号时停止匹配。
数量限定
字符 描述
X? 匹配前面的子表达式X零次或一次,要匹配 ? 字符使用 \?
X* 匹配前面的子表达式X零次或多次,要匹配 * 字符使用 \*
X+ 匹配前面的子表达式X一次或多次,要匹配 + 字符使用 \+
X{n} 匹配前面的子表达式X n次
X{n,} 匹配前面的子表达式X最少n次
X{n,m} 匹配前面的子表达式X最少n次,不超过m次
# 匹配全部都是数字的字符串^[0-9]*$**
# 匹配只有n位数字的字符串^\d{n}$**
# 匹配至少有n位数字的字符串^\d{n,}$**
# 匹配有m位到n位数字的字符串^\d{m,n}$**
# 匹配最多带两位小数的数字^([1-9][0-9]*)+(.[0-9]{1,2})?$**
# 匹配带1-2位小数的正数或负数^(\-)?\d+(\.\d{1,2})?$**
# 匹配正数、负数和小数^(\-|\+)?\d+(\.\d+)?$**
# 匹配正整数 ^ 1-9 ]\d*$**
# 匹配负整数^-[1-9]\d*$**
# 匹配浮点数^(-?\d+)(\.\d+)?$**
# 匹配正浮点数^\d+\.\d+$**
# 匹配负浮点数^-\d+\.\d+$**
# 匹配汉字^[\u4e00-\u9fa5]{0,}$**
# 匹配英文和数字^[A-Aa-z0-9]+$**
# 匹配中文、英文、数字和下划线组成的字符串^[\u4e00-\u9f5aA-Za-z0-9_]+$**
# 匹配email地址^[A-Za-z0-9._%±]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$**
# 匹配手机号码^1[3456789]\d{9}$**
# 匹配URL地址’[a-zA-Z]+://[^\s]***
# 匹配身份证号码(\d{15}$|^\d{18}$|\d{17}(\d|X|x))$**