正则表达式

来自百合仙子's Wiki
跳转到导航 跳转到搜索

元字符 {}+() 需要转义。

Perl

参见主条目Perl#正则表达式

平衡组/嵌套匹配:

将所有匹配的<>替换为空字符串

s/(<(?:[^<>]++|(?1))*>)//g

Python新正则库也支持此类匹配,如:

>>> regex.findall(r'(<(?:[^<>]++|(?1))*>)', '<a>, <b <c>>', overlapped=True)
['<a>', '<b <c>>', '<c>']

对照

单词边界

  • GNU sed:(扩展)\b\<, \>\B也支持[1]
  • BSD / Mac OS X sed: [[:<:]], [[:>:]][2]
  • GNU awk:(扩展)\<, \>\B也支持,但是不支持\b[3]
  • GNU grep:(扩展)\b\<, \>\B也支持[4]
  • Python: \b
  • Vim: \<, \>

常用的正则

IPv4 地址

_ip_re = re.compile(r'(?<!\d)(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))(?!\d)')

URL

[5]

link_re = re.compile(r'''\b(?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\((?:[^\s()<>]+|\([^\s()<>]+\))*\))+(?:\((?:[^\s()<>]+|\([^\s()<>]+\))*\)|[^\s`!()\[\]{};:'".,<>??«»“”‘’])''', re.ASCII | re.I)

注意:此正则可能导致问题。[6]

对于待匹配文本:

https://wiki.archlinux.org/index.php/USB_Installation_Media_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

对于某些正则实现,其括号部分会导致问题。括号中字符越多,问题越严重。

Python (3.3, 2.7) 自带正则引擎中,此匹配将消耗大量时间。在 PCRE 中会报错:「超过PCRE 的回溯限制」。

在 Python 的第三方库 mrab-regex 中无此问题。Perl 中无此问题。spidermonkey 提示「InternalError: regular expression too complex」,nodejs 会卡死(并且不接受键盘中断)。

重现此问题的简单示例:

s = '<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>'
r = re.compile(r'''(?:<(?:[^<>]+)*>)+b''')
r.findall(s)

另一个正则:jmrware - URL Linkification (HTTP/FTP)

另见分类:文本处理#匹配 URL

字符类型

比较全的中文字符范围:[7]

[\u3400-\u4DB5\u4E00-\u9FA5\u9FA6-\u9FBB\uF900-\uFA2D\uFA30-\uFA6A\uFA70-\uFAD9\uFF00-\uFFEF\u2E80-\u2EFF\u3000-\u303F\u31C0-\u31EF\u2F00-\u2FDF\u2FF0-\u2FFF\u3100-\u312F\u31A0-\u31BF\u3040-\u309F\u30A0-\u30FF\u31F0-\u31FF\uAC00-\uD7AF\u1100-\u11FF\u3130-\u318F\u4DC0-\u4DFF\uA000-\uA48F\uA490-\uA4CF\u2800-\u28FF\u3200-\u32FF\u3300-\u33FF\u2700-\u27BF\u2600-\u26FF\uFE10-\uFE1F\uFE30-\uFE4F]

地区

非中国大陆的国家和地区(简体中文、前缀匹配):

(阿布哈兹|阿富汗|阿尔巴尼亚|阿尔及利亚|安道尔|安哥拉|安提瓜和巴布达|阿根廷|亚美尼亚|阿尔扎赫|澳大利亚|奥地利|阿塞拜疆|巴哈马|巴林|孟加拉|巴巴多斯|白俄罗斯|比利时|伯利兹|贝宁|不丹|玻利维亚|波斯尼亚和黑塞哥维那|博茨瓦纳|巴西|文莱|保加利亚|布基纳法索|布隆迪|柬埔寨|喀麦隆|加拿大|佛得角|中非|乍得|智利|哥伦比亚|科摩罗|刚果|库克群岛|哥斯达黎加|科特迪瓦|克罗地亚|古巴|塞浦路斯|捷克|丹麦|吉布提|多米尼克|多米尼加|顿涅茨克|厄瓜多尔|埃及|萨尔瓦多|赤道几内亚|厄立特里亚|爱沙尼亚|斯威士兰|埃塞俄比亚|斐济|芬兰|法国|加蓬|冈比亚|格鲁吉亚|德国|加纳|希腊|格林纳达|危地马拉|几内亚|几内亚比绍|圭亚那|海地|洪都拉斯|匈牙利|冰岛|印度|印尼|伊朗|伊拉克|爱尔兰|以色列|意大利|牙买加|日本|约旦|哈萨克斯坦|肯尼亚|基里巴斯|科索沃|科威特|吉尔吉斯斯坦|老挝|拉脱维亚|黎巴嫩|莱索托|利比里亚|利比亚|列支敦士登|立陶宛|卢甘斯克|卢森堡|马达加斯加|马拉维|马来西亚|马尔代夫|马里|马耳他|马绍尔群岛|毛里塔尼亚|毛里求斯|墨西哥|密克罗尼西亚联邦|摩尔多瓦|摩纳哥|蒙古|黑山|摩洛哥|莫桑比克|缅甸|纳米比亚|瑙鲁|尼泊尔|荷兰|新西兰|尼加拉瓜|尼日尔|尼日利亚|纽埃|朝鲜|北塞浦路斯|北马其顿|马其顿|挪威|阿曼|巴基斯坦|帕劳|巴勒斯坦|巴拿马|巴布亚新几内亚|巴拉圭|秘鲁|菲律宾|波兰|葡萄牙|德涅斯特河沿岸|卡塔尔|罗马尼亚|俄罗斯|卢旺达|圣基茨和尼维斯|圣卢西亚|圣文森特和格林纳丁斯|萨摩亚|圣马力诺|圣多美和普林西比|沙特阿拉伯|塞内加尔|塞尔维亚|塞舌尔|塞拉利昂|新加坡|斯洛伐克|斯洛文尼亚|所罗门群岛|索马里|索马里兰|南非|韩国|南奥塞梯|南苏丹|西班牙|斯里兰卡|苏丹|苏里南|瑞典|瑞士|叙利亚|台湾|塔吉克斯坦|坦桑尼亚|泰国|东帝汶|多哥|汤加|特立尼达和多巴哥|突尼斯|土耳其|土库曼斯坦|图瓦卢|乌干达|乌克兰|阿联酋|英国|美国|乌拉圭|乌兹别克斯坦|瓦努阿图|梵蒂冈|委内瑞拉|越南|西撒哈拉|也门|赞比亚|津巴布韦|海外属地与其他特殊政区|海外属地与其他特殊政区|奥兰|美属萨摩亚|安圭拉|阿鲁巴|百慕大|开曼群岛|圣诞岛|科科斯|库拉索|福克兰群岛|法罗群岛|法属波利尼西亚|直布罗陀|格陵兰|关岛|根西|马恩岛|泽西|蒙特塞拉特|新喀里多尼亚|北马里亚纳群岛|皮特凯恩群岛|波多黎各|圣巴泰勒米|圣赫勒拿|圣皮埃尔和密克隆|圣马丁|斯瓦尔巴|托克劳|特克斯和凯科斯群岛|英属维尔京群岛|美属维尔京群岛|瓦利斯和富图纳|留尼汪|荷属圣马丁|琉球|法属圭亚那|法属圣马丁|诺福克岛|瓜德罗普|马提尼克|澳门|中国澳门|香港|中国香港|台湾|中国台湾)

更大的地区(简体中文、前缀匹配):

(非洲|欧洲|亚太地区|东亚|东南亚|东北欧|中东|东南欧|拉美|美洲|日韩|太平洋|南美|南极洲|南亚|北美|北非|中欧)

参见

外部链接

文档与标准

教程

测试

收集

其它

参考资料