匹配多行字符串并向其反向引用

时间:2019-07-08 14:45:36

标签: python regex

我尝试在Python中使用re.sub解析字符串。必须使用解释为here的反向引用来替换它。我无法将我的正则表达式语句应用于代码。我认为换行是原因。我该怎么解决?

我尝试解析要在postgreSQL中导入的代码。与元数据(作者,内容的日期)相比,该内容被分成多行,这会引起问题。由于此示例是循环的一部分,因此不同输入数据中的行数不相同。

import re
data = '''<data>content line 1
content line 2
content line 3</data>'''
replacement = r"<data>'([\w\W]*)'</data>"
sub = re.sub(replacement, r"'data' : '\1'", data)
print(sub)

预期的输出应该是(预期和必要的单引号'):

'data' : 'content line 1
content line 2
content line 3'

但是输出等于data

我已经尝试过的东西

解决方案1 ​​

我已经尝试了其他应该能够处理多行的转义符

[\s\S]*
[\d\D]*

source: Tyler on stackoverflow

解决方案2

我没有成功地使用\Z而不是[\w\W]

解决方案3

我还尝试使用以下代码进行re.DOTALL,但在这里,output等于input

replacement = r"<data>'(.*)'</data>"
sub = re.sub(replacement, r"'data' : '\1'", data, re.DOTALL)

解决方案4

有几乎相似的question on stackoverflow。不能使用像Beatifulsoup这样的html解析器,因为正则表达式实际上要复杂得多,并且包含与BeautifulSoup相匹配的模式。此处提到的以下其他解决方案无法解决问题,所有解决方案都导致了output=input。我尝试过:

  1. re.M的末尾添加sub = re.sub(replacement, r"'data' : '\1'", data, re.M)
  2. re.S的末尾添加sub = re.sub(replacement, r"'data' : '\1'", data, re.S)

0 个答案:

没有答案