str.split(pattern)::只支持简单匹配,不支持空格和多个匹配进行分割
re.split(pattertn,str) 支持空格和多个匹配进行分割
贪婪模式和非贪婪模式:
1.什么是正则表达式的贪婪与非贪婪匹配
如:String str="abcaxc";
Patter p="ab.*c";
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab.*c)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab.*c)。
2.编程中如何区分两种模式
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
量词:{m,n}:m到n个
*:任意多个
+:一个到多个
?:0或一个
命令行下:
import re
re.split(r'.',sp)
['', '', '', '', '', '', '', '']
sp
'abc.txt'
re.split(r'\.',sp)
['abc', 'txt']
编辑器下:
print(
"""
在 正则中 具有 含义 的 符号 也将 作为 分隔符 的 通用 解决 办法 ,请不要 在 尝试 要有 多少个 ‘\’
""")
delimiters = "a", "...", "(C)"
regexPattern = '|'.join(map(re.escape, delimiters)) # 加|表示或的意思,自己电脑上运行note |不是/而是竖线对应开头的'|' a|\.\.\.|\(C\) 原博客上显示'a|\\.\\.\\.|\\(C\\)'
print(regexPattern)
line = "stackoverflow (C) is awesome... isn't it?"
print(re.split(regexPattern,line)) # ['st', 'ckoverflow ', ' is ', 'wesome', " isn't it?"]
regexPattern1 = ''.join(map(re.escape, delimiters))
print(regexPattern1)
print(re.split(regexPattern1,line))
print(
"""
一些 更 复杂 的 就 需要 你对 正则 表达式 的更 深入 的 了解了
以下是 stackoverflow的 关于 re.split的 问题
""")
##split a string like "HELLO there HOW are YOU" by uppercase, thus the result is ['HELLO there', 'HOW are', 'YOU']
line1 = "HELLO there HOW are YOU "
print(re.split(r"\s+(?=[A-Z]+)", line1)) # 后向匹配
# i want to split “400-IF(3>5,5,5)+34+IF(4>5,5,6)” by string 'IF(3>5,5,5)', so re.split() should give list with length: 2 ['400-', '+34+']
line2 = "400-IF(3>5,5,5)+34+IF(4>5,5,6)"
print(' '.join(re.split(r'IF\(.*?\)',line2)).split()) # 原文理解有错,非贪婪模式,匹配到一个就好IF(3>5,5,5)和IF(3>5,5,5) result:['400-', '+34+']
print(' '.join(re.split(r'IF\(.*\)',line2)).split()) # 贪婪模式:趋于最大长度匹配,IF(3>5,5,5)+34+IF(4>5,5,6) result:['400-']
正则前面的 (?i) (?s) (?m) (?is) (?im)
2017年09月26日 10:15:45
阅读数:225
Q:经常看见的正则前面的 (?i) (?s) (?m) (?is) (?im) 是什么意思?
A: 称为内联匹配模式,通常用内联匹配模式代替使用枚举值RegexOptions指定的全局匹配模式,写起来更简洁。
(?i) 表示所在位置右侧的表达式开启忽略大小写模式
(?s) 表示所在位置右侧的表达式开启单行模式。
更改句点字符 (.) 的含义,以使它与每个字符(而不是除 \n 之外的所有字符)匹配。
注意:(?s)通常在匹配有换行的文本时使用
(?m) 表示所在位置右侧的表示式开启指定多行模式。
更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,
而不只是与整个字符串的开头和结尾匹配。
注意:(?m)只有在正则表达式中涉及到多行的“^”和“$”的匹配时,才使用Multiline模式。
上面的匹配模式可以组合使用,比如(?is),(?im)。
另外,还可以用(?i:exp)或者(?i)exp(?-i)来指定匹配的有效范围。