regular_expression - JasonWayne/personal-wiki GitHub Wiki
最好的参考资料自然是这篇正则表达式30分钟入门教程了
http://stackoverflow.com/questions/2206378/how-to-split-a-string-but-also-keep-the-delimiters
python中则容易很多,
# 在python中使用正则表达式最好加上r,减少不必要的escape
In [85]: a = re.split(r'(-)', r'abc-def')
In [86]: a
Out[86]: ['abc', '-', 'def']
# python中的match是个奇特的存在,其他语言一般无对应版本,match会从字符串开始处进行匹配
p = re.compile(r'<Html>')
# 无法匹配到
m = p.match('a<Html>')
# search相当于其他语言中的match,在整个字符串中搜索pattern,返回得到一个match对象
m = p.search('a<Html>')
# findall是python中的独特实现,直接返回一个列表,包含所有匹配到的pattern
l = p.findall('<Html>aaaa<Html>')
In [104]: l
Out[104]: ['<Html>', '<Html>']
# findall返回的是匹配字符串组成的列表,缺少一些信息,比如匹配到的字符串在原串中的位置
# 因此python还提供了finditer来逐个返回匹配的match对象
>>> pattern = re.compile(r"(\w+) (\w+)")
>>> it = pattern.finditer("Hello⇢world⇢hola⇢mundo") >>> match = it.next()
>>> match.groups()
('Hello', 'world')
>>> match.span()
(0, 11)
>>> match = it.next()
>>> match.groups()
('hola', 'mundo')
>>> match.span()
(12, 22)
# sub的用法
# 用函数作为参数,接受match对象为输入,输出不同的repl(replacement)字符串
>>>def normalize_orders(matchobj):
if matchobj.group(1) == '-': return "A"
else: return "B"
>>> re.sub('([-|A-Z])', normalize_orders, '-1234⇢A193⇢ B123') 'A1234⇢B193⇢B123'
# 利用group来将markdown转化为html,注意这里的\g<1>,1是被尖括号包围的
>>> text = "imagine⇢a⇢new⇢*world*,⇢a⇢magic⇢*world*" >>> pattern = re.compile(r'\*(.*?)\*')
>>> pattern.sub(r"<b>\g<1><\\b>", text) 'imagine⇢a⇢new⇢<b>world<\\b>,⇢a⇢magic⇢<b>world<\\b>'