python 正则表达式提取字符串

以某个字符开始、某个字符结束,期待的提取结果包含首末字符串

提取公式: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 方法1

    micro_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 re

str = "a123b"

print(re.findall(r"a(.+?)b",str))

#输出['123']

贪婪和非贪婪匹配

import re

str = "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 re

text = "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 re

pattern = 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))$**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44245323

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值