以某個字符開始、某個字符結束,期待的提取結果包含首末字符串
提取公式: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))$**