java string 返回匹配正则的字符串的起始位置_【Python】正则表达式
概述
正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。?
Python 自1.5版本起增加了re 模塊,它提供 Perl 風格的正則表達式模式。
re 模塊使 Python 語言擁有全部的正則表達式功能。?
compile 函數根據一個模式字符串和可選的標志參數生成一個正則表達式對象。該對象擁有一系列方法用于正則表達式匹配和替換。?
re 模塊也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字符串做為它們的第一個參數。
正則表達式對象
re.RegexObject?
re.compile() 返回 RegexObject 對象。?
re.MatchObject?
group() 返回被RE匹配的字符串。?
start() 返回匹配開始的位置?
end() 返回匹配結束的位置?
span() 返回一個元組包含匹配 (開始,結束) 的位置
可選標志
正則表達式可以包含一些可選標志修飾符來控制匹配的模式。修飾符被指定為一個可選的標志。
多個標志可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設置成 I 和 M 標志:
修飾符 描述re.I? ?使匹配對大小寫不敏感
re.L? ?做本地化識別(locale-aware)匹配
re.M? ?多行匹配,影響 ^ 和 $
re.S? ?使 . 匹配包括換行在內的所有字符
re.U ?根據Unicode字符集解析字符。這個標志影響 \w, \W, \b, \B.
re.X ?該標志通過給予你更靈活的格式以便你將正則表達式寫得更易于理解。
正則表達式模式
模式字符串使用特殊的語法來表示一個正則表達式:字母和數字表示他們自身。
一個正則表達式模式中的字母和數字匹配同樣的字符串。多數字母和數字前加一個反斜杠時會擁有不同的含義。
標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義。反斜杠本身需要使用反斜杠轉義。
模式描述^ //匹配字符串的開頭
$ //匹配字符串的末尾。
. //匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符。
[...] //用來表示一組字符,單獨列出:[amk] 匹配 'a','m'或'k'
[^...] //不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* //匹配0個或多個的表達式。
re+ //匹配1個或多個的表達式。
re? //匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式
re{ n} //匹配n個前面表達式。例如,"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的兩個o。
re{ n,} //精確匹配n個前面表達式。例如,"o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。"o{1,}"等價于"o+"。"o{0,}"則等價于"o*"。
re{ n, m} //匹配 n 到 m 次由前面的正則表達式定義的片段,貪婪方式
a| b //匹配a或b
(re) //匹配括號內的表達式,也表示一個組
(?imx) //正則表達式包含三種可選標志:i, m, 或 x 。只影響括號中的區域。
(?-imx) //正則表達式關閉 i, m, 或 x 可選標志。只影響括號中的區域。
(?: re) //類似 (...), 但是不表示一個組
(?imx: re) //在括號中使用i, m, 或 x 可選標志
(?-imx: re) //在括號中不使用i, m, 或 x 可選標志
(?#./..) //注釋
(?= re) //前向肯定界定符。如果所含正則表達式,以 ... 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩余部分還要嘗試界定符的右邊。
(?! re) //前向否定界定符。與肯定界定符相反;當所含表達式不能在字符串當前位置匹配時成功。
(?> re) //匹配的獨立模式,省去回溯。
\w //匹配數字字母下劃線
\W //匹配非數字字母下劃線
\s //匹配任意空白字符,等價于 [\t\n\r\f]。
\S //匹配任意非空字符
\d //匹配任意數字,等價于 [0-9]。
\D //匹配任意非數字
\A //匹配字符串開始
\Z //匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。
\z //匹配字符串結束
\G //匹配最后匹配完成的位置。
\b //匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B //匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等//匹配一個換行符。匹配一個制表符, 等
\1...\9??//匹配第n個分組的內容。
\10??//匹配第n個分組的內容,如果它經匹配。否則指的是八進制字符碼的表達式。
正則表達式實例
字符匹配python //匹配 "python".
字符類
[Pp]ython //匹配 "Python" 或 "python"
rub[ye]??//匹配 "ruby" 或 "rube"
[aeiou]??//匹配中括號內的任意一個字母
[0-9]??//匹配任何數字。類似于 [0123456789]
[a-z]??//匹配任何小寫字母
[A-Z]??//匹配任何大寫字母
[a-zA-Z0-9]??//匹配任何字母及數字
[^aeiou]??//除了aeiou字母以外的所有字符
[^0-9]??//匹配除了數字外的字符
特殊字符類
. //匹配除 "\n" 之外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用象 '[.\n]' 的模式。
\d //匹配一個數字字符。等價于 [0-9]。
\D //匹配一個非數字字符。等價于 [^0-9]。
\s //匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。
\S //匹配任何非空白字符。等價于 [^ \f\n\r\t\v]。
\w //匹配包括下劃線的任何單詞字符。等價于'[A-Za-z0-9_]'。
\W //匹配任何非單詞字符。等價于 '[^A-Za-z0-9_]'。
re.match函數
re.match 嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。
函數語法:
re.match(pattern, string, flags=0)參數說明:
pattern //匹配的正則表達式string??//要匹配的字符串。
flags //標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等
可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。
group(num=0) //匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。groups() //返回一個包含所有小組字符串的元組,從 1 到 所含的小組號。
示例:
import?redef?main():
????line = "Cats are smarter than dogs"
????# .* 表示任意匹配除換行符(\n、\r)之外的任何單個或多個字符
????matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)
????if?matchObj:
????????print("matchObj.group() : ", matchObj.group())
????????print("matchObj.group(0) : ", matchObj.group(0))
????????print("matchObj.group(1) : ", matchObj.group(1))
????????print("matchObj.group(2) : ", matchObj.group(2))
????????print("matchObj.groups : ", matchObj.groups)
????else:
????????print("No match!!")
if?__name__ == "__main__":
????main()
輸出:
matchObj.group() : Cats are smarter than dogsmatchObj.group(0) : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
matchObj.groups : in?method groups of re.Match object?at 0x02E87260>
re.search方法
re.search 掃描整個字符串并返回第一個成功的匹配。?
函數語法:
re.search(pattern, string, flags=0)參數說明
pattern //匹配的正則表達式string??//要匹配的字符串。
flags //標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。參見:正則表達式修飾符 - 可選標志
可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。
group(num=0) //匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。groups() //返回一個包含所有小組字符串的元組,從 1 到 所含的小組號。
示例
import?redef?main():
????print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
????print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
????line = "Cats are smarter than dogs"
????searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)
????if?searchObj:
????????print("searchObj.group() : ", searchObj.group())
????????print("searchObj.group(1) : ", searchObj.group(1))
????????print("searchObj.group(2) : ", searchObj.group(2))
????else:
????????print("Nothing found!!")
if?__name__ == "__main__":
????main()
輸出:
(0, 3)(11, 14)
searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter
re.match與re.search的區別
re.match 只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回 None,而 re.search 匹配整個字符串,直到找到一個匹配。
示例:
import?redef?main():
????line = "Cats are smarter than dogs"
????matchObj = re.match(r'dogs', line, re.M | re.I)
????if?matchObj:
????????print("match --> matchObj.group() : ", matchObj.group())
????else:
????????print("No match!!")
????matchObj = re.search(r'dogs', line, re.M | re.I)
????if?matchObj:
????????print("search --> matchObj.group() : ", matchObj.group())
????else:
????????print("No match!!")
if?__name__ == "__main__":
????main()
運行輸出:
No match!!search --> matchObj.group() : dogs
檢索和替換
Python 的re模塊提供了re.sub用于替換字符串中的匹配項。
語法:
re.sub(pattern, repl, string, count=0, flags=0)參數:
pattern : 正則中的模式字符串。
repl : 替換的字符串,也可為一個函數。
string : 要被查找替換的原始字符串。
count : 模式匹配后替換的最大次數,默認 0 表示替換所有的匹配。
flags : 編譯時用的匹配模式,數字形式。前三個為必選參數,后兩個為可選參數。
示例:
import?redef?main():
????phone = "2004-959-559 # 這是一個電話號碼"
????# 刪除注釋
????num = re.sub(r'#.*$', "", phone)
????print("電話號碼 : ", num)
????# 移除非數字的內容
????num = re.sub(r'\D', "", phone)
????print("電話號碼 : ", num)
if?__name__ == "__main__":
????main()
運行輸出:
電話號碼 : 2004-959-559電話號碼 : 2004959559
repl 參數是一個函數:
import re?
# 將匹配的數字乘于 2
def double(matched):value?= int(matched.group('value'))
????return?str(value?* 2)
?
s = 'A23G4HFD567'
print(re.sub('(?P\d+)', double, s))
輸出:
A46G8HFD1134compile 函數
compile 函數用于編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() 和 search() 這兩個函數使用。
語法格式為:
re.compile(pattern[, flags])參數:
pattern : 一個字符串形式的正則表達式
flags可選,表示匹配模式,比如忽略大小寫,多行模式等,
具體參數為:
1、re.I 忽略大小寫 re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當前環境
2、re.M 多行模式
3、re.S 即為' . '并且包括換行符在內的任意字符(' . '不包括換行符)
4、re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數據庫
5、re.X 為了增加可讀性,忽略空格和' # '后面的注釋
?示例:
import?redef?main():
????pattern = re.compile(r'\d+') # 用于匹配至少一個數字
????m = pattern.match('one12twothree34four') # 查找頭部,沒有匹配
????print(m)
????m1 = pattern.match('one12twothree34four', 3, 10) # 從'1'的位置開始匹配,正好匹配
????print(m1.group(0)) # 可省略 0
????print(m1.start(0)) # 可省略 0
????print(m1.end(0)) # 可省略 0
????print(m1.span(0)) # 可省略 0
if?__name__ == "__main__":
????main()
輸出:
None12
3
5
(3, 5)
當匹配成功時返回一個 Match 對象,其中:?
group([group1, …]) 方法用于獲得一個或多個分組匹配的字符串,當要獲得整個匹配的子串時,可直接使用 group() 或 group(0);
start([group]) 方法用于獲取分組匹配的子串在整個字符串中的起始位置(子串第一個字符的索引),參數默認值為 0;
end([group]) 方法用于獲取分組匹配的子串在整個字符串中的結束位置(子串最后一個字符的索引+1),參數默認值為 0;
span([group]) 方法返回 (start(group), end(group))。
findall
在字符串中找到正則表達式所匹配的所有子串,并返回一個列表,如果沒有找到匹配的,則返回空列表。?
注意:match 和 search 是匹配一次 findall 匹配所有。
語法格式為:
re.findall(string[, pos[, endpos]])參數:?
string 待匹配的字符串。
pos可選參數,指定字符串的起始位置,默認為 0。
endpos可選參數,指定字符串的結束位置,默認為字符串的長度。
示例:
import?redef?main():
????pattern = re.compile(r'\d+')?# 查找數字
????result1 = pattern.findall('碼上 123 google 456')
????result2 = pattern.findall('py88th123python456',?0,?10)
????print(result1)
????print(result2)
if?__name__ ==?"__main__":
????main()
輸出:
['123', '456']['88', '123']
re.finditer
和 findall 類似,在字符串中找到正則表達式所匹配的所有子串,并把它們作為一個迭代器返回。
re.finditer(pattern, string, flags=0)參數說明
pattern //匹配的正則表達式string??//要匹配的字符串。
flags //標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。參見:正則表達式修飾符 - 可選標志
示例:
import?redef?main():
????it = re.finditer(r"\d+", "12a32bc43jf3")
????for?match in?it:
????????print(match.group())
if?__name__ == "__main__":
????main()
輸出:
1232
43
3
re.split
split 方法按照能夠匹配的子串將字符串分割后返回列表,
使用形式如下:
re.split(pattern, string[, maxsplit=0, flags=0])參數說明:
pattern //匹配的正則表達式string??//要匹配的字符串。
maxsplit //分隔次數,maxsplit=1 分隔一次,默認為 0,不限制次數。
flags //標志位,用于控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。參見:正則表達式修飾符 - 可選標志
示例:
import?redef?main():
????print( re.split('\W+', 'python, 我, 喜歡.'))
if?__name__ == "__main__":
????main()
輸出:
['python', '我', '喜歡', '']完
? 碼上加油站
? 一起來加油
長按掃碼關注
點“在看”你懂得
總結
以上是生活随笔為你收集整理的java string 返回匹配正则的字符串的起始位置_【Python】正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php箱子,webshell箱子php版
- 下一篇: python语言编程基础视频_网络编程-