注册

详解Python re.escape.MULTILINE函数:启用多行模式

re.escape 函数的作用与使用方法

re.escape(string)函数可以用于转义正则表达式中需要转义的字符,返回对字符串进行转义后的字符串。在使用正则表达式时,若字符串中的一些字符需要转义,使用该函数可以避免手工输入确保正则表达式的正确性。

import re

# 普通的正则匹配
pattern = re.compile('^.*?\[(.*?)\].*?$')
string = '2022-01-01 [新年寄语] 晚安!'
match = pattern.match(string)
print(match.group(1))  # 输出"新年寄语"

# 使用re.escape转义特殊字符
pattern_escaped = re.compile('^.*?' + re.escape('[') + '(.*?)' + re.escape(']') + '.*?$')
match_escaped = pattern_escaped.match(string)
print(match_escaped.group(1)) # 输出"新年寄语"

MULTILINE 函数的作用与使用方法

MULTILINE是re模块中一个非常常见的标记,它用于指定正则表达式中的 ^$ 符号的匹配方式。若要让该标记生效,需要在调用compile函数时加上re.MULTILINE参数。

  • 若没有该标记:当编译正则表达式时不设置多行模式,并且正则中以"^"或"$"匹配开头或结尾的字串默认只匹配开头或结尾。
  • 若有该标记MULTILINE:$和^分别匹配行尾和行首,其效果类似于设置了re.compile(/^/m)和re.compile(/$/m)的效果。
import re

# 编译多行模式正则表达式并匹配
pattern = re.compile('^(.*)$', re.MULTILINE)
string = 'Line 1\nLine 2\nLine 3\n'
match = pattern.findall(string)
print(match)  # 输出['Line 1', 'Line 2', 'Line 3']

# 普通模式下且不设置 MULTILINE 标记的正则表达式匹配
pattern_no_multiline = re.compile('^.*$')
match_no_multiline = pattern_no_multiline.findall(string)
print(match_no_multiline)  # ['Line 1']

实例

匹配Markdown格式中的代码块

import re

# 用于匹配Markdown格式中的代码块
block_pattern = re.compile(re.escape('```') + '(.*?)' + re.escape('```'), re.DOTALL)

string = '''Markdown文本内容:这是其中的一些代码块:

import module_name
class ClassName:
def init(self):
self.name = 'a'
def print_name(self):
print(self.name)
print('Hello World!')

'''

match = block_pattern.findall(string)
print(match[0]) # 输出匹配到的代码块

使用 MULTILINE 标记在字符串开头匹配所有的大写字母

import re

# 使用MULTILINE标记匹配字符串开头的所有大写字母
uppercase_pattern = re.compile('^([A-Z]+)', re.MULTILINE)

string = '''ABC
abc
DEF
def
GHI
jkl'''

match = uppercase_pattern.findall(string)
print(match) # 输出匹配到的结果 ['ABC', 'DEF', 'GHI']

参考资料

  1. Python re.escape():正则中需要转义的字符串处理
  2. Python re.MULTILINE:匹配多行文本