compile可以生成一个简单的pattern,供re.search和re.match使用。
p = re.compile(r"[!?',;.]")
print "p=", p
>>>p = re.compile("[!?',;.]")
p代表的就是re.compile("[!?’,;.]"),这是一个pattern,在文档里一般也是叫这个,如re.match(pattern, string, flags=0)
,pattern的意义是一个规则,就是你希望匹配到什么样式的字符。
r的意思是不转义,解释如下,引自Python官方文档。
The solution is to use Python’s raw string notation for regular expression patterns; backslashes are not handled in any special way in a string literal prefixed with ‘r’. So r"\n" is a two-character string containing ‘’ and ‘n’, while “\n” is a one-character string containing a newline. Usually patterns will be expressed in Python code using this raw string notation.
解决方案是使用 Python 的原始字符串表示法来表达正则样式;在以 ‘r’ 为前缀的字符串文本中, 反斜杠没有任何转义。 因此,r"\n"
是一个包含 ‘’ 和 ‘n’ 的双字符字符串, 而 “\n” 是包含换行符的一个字符字符串。 我们一般用原始表示法来表达样式。
此函式是将匹配到的字符替换掉。基本语法为re.sub(pattern, repl, string, count=0, flags=0)
。
p = re.compile(r"[!?',;.]")
sub_para = p.sub(' ', paragraph.lower())
sub_para2 = re.sub(p, ' ', paragraph.lower())
以上两种写法意思相同。
由此完成了替换。
本来之前这样就可以解决问题,但是后来出现了一些test cases让这种做法报错了。
其实,Python的re模块还有很多强大的功能。
’+‘ 对它前面的正则式匹配1到任意次重复。 ab+ 会匹配 ‘a’ 后面跟随1个以上到任意个 ‘b’,它不会匹配 ‘a’。
’?‘ 对它前面的正则式匹配0到1次重复。 ab? 会匹配 ‘a’ 或者 ‘ab’。
’\w‘ 对于 Unicode (str) 样式:
匹配Unicode词语的字符,包含了可以构成词语的绝大部分字符,也包括数字和下划线。如果设置了 ASCII 标志,就只匹配 [a-zA-Z0-9_] 。
对于8位(bytes)样式:
匹配ASCII字符中的数字和字母和下划线,就是 [a-zA-Z0-9_] 。如果设置了 LOCALE 标记,就匹配当前语言区域的数字和字母和下划线。
所以可以之间使用/w+,即可完成替换。
p1 = re.findall(r"\w+", paragraph.lower())
更多黑科技可以参看Python官方文档:https://docs.python.org/zh-cn/3.7/library/re.html。