regular_expression - JasonWayne/personal-wiki GitHub Wiki

最好的参考资料自然是这篇正则表达式30分钟入门教程

Java中分割字符串,并保留分隔符

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, search, findall

# 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>'
⚠️ **GitHub.com Fallback** ⚠️