單詞起始位置、結束位置、分界位置
regex用\m表示單詞起始位置,用\M表示單詞結束位置。
\b:是單詞分界位置,但不能區分是起始還是結束位置。
局部範圍的flag控制
(?flags-flags:...)
在re模塊,flag只能作用於整個表達式,現在可以作用於局部範圍了:
>>> regex.search(r"<B>(?i:good)</B>", "<B>GOOD</B>") <regex.Match object; span=(0, 11), match='<B>GOOD</B>'>
在這個例子裏,忽略大小寫模式只作用於標籤之間的單詞。
(?i:)是打開忽略大小寫,(?-i:)則是關閉忽略大小寫。
如果有多個flag挨着寫既可,如(?is-f:):減號左邊的是打開,減號右邊的是關閉。
全局範圍的flag控制
除了局部範圍的flag,還有全局範圍的flag控制,如 (?si-f)<B>good</B>
re模塊也支持這個,可以參見Python文檔。
把flags寫進表達式、而不是以函數參數的方式聲明,方便直觀且不易出錯。
Additional features:附加功能
Added support for lookaround in conditional pattern (Hg issue 163)
對條件模式中環顧四周的支持
>>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc')
<regex.Match object; span=(0, 3), match='123'>
>>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123')
<regex.Match object; span=(0, 6), match='abc123'>
這與在一對替代方案的第一個分支中進行環視不太一樣。
>>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc')) # 若分支1不匹配,嘗試第2個分支
<regex.Match object; span=(0, 6), match='123abc'>
>>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc')) # 若分支1不匹配,不嘗試第2個分支
None
在第一個示例中,環顧四周匹配,但第一個分支的其餘部分不匹配,因此嘗試了第二個分支,而在第二個示例中,環顧四周匹配,並且第一個分支不匹配,但是第二個分支沒有嘗試。
Added POSIX matching (leftmost longest) (Hg issue 150)
POSIX匹配(最左最長):(?p)
>>> # Normal matching.
>>> regex.search(r'Mr|Mrs', 'Mrs')
<regex.Match object; span=(0, 2), match='Mr'>
>>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient')
<regex.Match object; span=(0, 7), match='oneself'>
>>> # POSIX matching.
>>> regex.search(r'(?p)Mr|Mrs', 'Mrs')
<regex.Match object; span=(0, 3), match='Mrs'>
>>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient')
<regex.Match object; span=(0, 17), match='oneselfsufficient'>
Added (?(DEFINE)...) (Hg issue 152)
命名組:如果沒有名爲“ DEFINE”的組,則…將被忽略,但只要有任何組定義,(?(DEFINE))將可用:
>>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants')
<regex.Match object; span=(0, 11), match='5 elephants'>
# 卡兩頭爲固定樣式、中間隨意的內容
>>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant)[\u4E00-\u9FA5](?&item)', '123哈哈dog')
<regex.Match object; span=(0, 8), match='123哈哈dog'>
[[a-z]--[aeiou]] |
V0:simple sets,與re模塊兼容 V1:nested sets,功能增強,集合包含'a'-'z',排除“a”, “e”, “i”, “o”, “u” eg: regex.search(r'(?V1)[[a-z]--[aeiou]]+', 'abcde') 或 regex.search(r'[[a-z]--[aeiou]]+', 'abcde', flags=regex.V1) <regex.Match object; span=(1, 4), match='bcd'> |
(?p) |
POSIX匹配(最左最長匹配) eg: regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient')
>>> regex.search(r'(?p)Mr|Mrs', 'Mrs') |
(?(DEFINE)...) |
命名組內容及名字:如果沒有名爲“ DEFINE”的組,則…將被忽略,但只要有任何組定義,(?(DEFINE))將起作用。 eg: >>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants')
# 卡兩頭爲固定樣式、中間隨意的內容 |
\K |
保留K出現位置之後的匹配內容,丟棄其之前的匹配內容。 >>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef') >>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef')
|
expandf |
使用下標來獲取重複捕獲組的捕獲 >>> m = regex.match(r"(\w)+", "abc") 定義組名
>>> m = regex.match(r"(\w+) (\w+)", "foo bar") >>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar")
同樣可以用於search()方法 |
subf subfn |
subf和subfn分別是sub和subn的替代方案。當傳遞替換字符串時,他們將其視爲格式字符串。
>>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar") |
partial |
部分匹配:match、search、fullmatch、finditer都支持部分匹配,使用partial關鍵字參數設置。匹配對象有一個pattial參數,當部分匹配時返回True,完全匹配時返回False
>>> regex.search(r'\d{4}', '12', partial=True) |
capturesdict() groupdict() captures() |
capturesdict() 是 groupdict() 和 captures()的結合: groupdict():返回一個字典,key = 組名,value = 匹配的最後一個值 captures():返回一個所有匹配值的列表 capturesdict():返回一個字典,key = 組名,value = 所有匹配值的列表
>>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n") |
(?P<name>) 允許組名重複 |
允許組名重複,後面的捕獲覆蓋前面的捕獲 >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second") >>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ")
強制性組: >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second") >>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ")
|
detach_string |
匹配對象通過其string屬性,對所搜索字符串進行引用。detach_string方法將“分離”該字符串,使其可用於垃圾回收,如果該字符串很大,則可能節省寶貴的內存。
|
(?0)、(?1)、(?2) |
(?R)或(?0)嘗試遞歸匹配整個正則表達式。 >>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups() >>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak") |
模糊匹配 |
三種類型錯誤:
Examples:
如果指定了某種類型的錯誤,則不允許任何未指定的類型。在以下示例中,我將省略item並僅寫出模糊性:
It’s also possible to state the costs of each type of error and the maximum permitted total cost. Examples:
Examples:
默認情況下,模糊匹配將搜索滿足給定約束的第一個匹配項。ENHANCEMATCH (?e)標誌將使它嘗試提高找到的匹配項的擬合度(即減少錯誤數量)。 BESTMATCH標誌將使其搜索最佳匹配。
匹配對象具有屬性fuzzy_counts,該屬性給出替換、插入和刪除的總數:
匹配對象還具有屬性fuzzy_changes,該屬性給出替換、插入和刪除的位置的元組:
|
\L<name> |
Named lists 老方法:p = regex.compile(r"first|second|third|fourth|fifth"),如果列表很大,則解析生成的正則表達式可能會花費大量時間,並且還必須注意正確地對字符串進行轉義和正確排序,例如,“ cats”位於“ cat”之間。 新方法: 順序無關緊要,將它們視爲一個set >>> option_set = ["first", "second", "third", "fourth", "fifth"] >>> p = regex.compile(r"\L<options>", options=option_set) named_lists屬性: >>> print(p.named_lists) # Python 3 {'options': frozenset({'fifth', 'first', 'fourth', 'second', 'third'})} # Python 2 {'options': frozenset(['fifth', 'fourth', 'second', 'third', 'first'])} |
Set operators |
僅版本1行爲 添加了集合運算符,並且集合可以包含嵌套集合。 按優先級高低排序的運算符爲:
隱式聯合,即[ab]中的簡單並置具有最高優先級。因此,[ab && cd] 與 [[a || b] && [c || d]] 相同。 eg:
|
匹配對象具有其他方法,這些方法返回有關重複捕獲組的所有成功匹配的信息。這些方法是:
>>> m = regex.search(r"(\w{3})+", "123456789") >>> m.group(1) '789' >>> m.captures(1) ['123', '456', '789'] >>> m.start(1) 6 >>> m.starts(1) [0, 3, 6] >>> m.end(1) 9 >>> m.ends(1) [3, 6, 9] >>> m.span(1) (6, 9) >>> m.spans(1) [(0, 3), (3, 6), (6, 9)] |
|
訪問組的方式 |
(1)通過下標、切片訪問: >>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu") >>> print(m["before"]) pqr >>> print(len(m)) 4 >>> print(m[:]) ('pqr123stu', 'pqr', '123', 'stu') (2)通過group("name")訪問: '123'
(3)通過組序號訪問: 'pqr123stu' >>> m.group(1) 'pqr' |
?r |