用Python正则表达式匹配字符串直到行末
如果我有一个很长的字符串,里面有多行内容,我想只匹配某一行的部分内容到这一行的结尾,最好的方法是什么呢?
举个例子,我有这样的内容,我希望在遇到换行符的时候就停止匹配。
r"(?P<name>[A-Za-z\s.]+)"
我在一个之前的回答中看到过这个:
$ - 表示匹配到字符串的末尾,或者如果启用了多行模式,则表示匹配到行的末尾。
那么我的问题是,如何像那个回答的作者说的那样“启用多行模式”呢?
3 个回答
1
看看 flags
这个参数,详细信息可以在这个链接找到:http://docs.python.org/library/re.html#module-contents
2
你可以通过在调用 re.compile()
时传入 re.MULTILINE
作为第二个参数来启用多行匹配。不过,有一点需要注意:因为 +
这个符号是贪婪的,它会尽可能匹配最长的字符串,所以如果下一行是由字母和空格组成的,正则表达式可能会匹配到多行内容($
是用来匹配任何字符串的结尾)。
解决这个问题有三种方法:
- 修改你的正则表达式,让它在匹配空白字符时不包括换行符(
\s
),这样你的重复字符集就不会匹配到换行符。 - 把量词改成
+?
,这是+
的非贪婪(“最小”)版本,这样它就会尽量匹配最短的字符串,从而在第一个换行符处停止。 - 先把文本按行分开,变成每行一个字符串(使用
text.split('\n')
)。
12
简单来说,你可以使用
r"(?P<name>[A-Za-z\t .]+)"
这个方法会匹配ASCII字母、空格、制表符或者句点。它会在遇到第一个不在这个组里的字符时停止匹配——换句话说,换行符不在这个组里(而换行符是包含在\s
里的,所以无论多行模式是否开启,这个都没关系)。