我正在编写一个脚本来浏览产品数据库,其中包含格式不正确,格式不一致的产品描述,以使其HTML统一。我遇到的一个问题是捕获和替换以相同方式格式化的代码行。例如,我想替换所有

• item 1
• item 2
• item 3




<ul>
  <li>item 1</li>
  <li>item 3</li>
  <li>item 2</li>
</ul>


&bull;行替换每个<li>content</li>行很容易,但是我一生都无法弄清楚该正则表达式在列表之前和之后都可以使用。不过,我要捕获以&bull;开头的所有内容,直到有一个不以&bull;开头的换行符为止。这是我最新的尝试(python):

In  : p = re.compile(
        r'&bull;.*(?!^&bull;)'
      )

In  : p.findall(text, re.MULTILINE, re.DOTALL)
Out : []

In  : p.findall(text, re.MULTILINE)
Out : ['&bull; item 1', '&bull; item 2', '&bull; item 3']

In  : p.findall(text, re.DOTALL)
Out : ['&bull; item 1', '&bull; item 2', '&bull; item 3']

In  : p.findall(text)
Out : ['&bull; item 1', '&bull; item 2', '&bull; item 3']


关于如何捕获类似['&bull; item 1\n&bull; item 2\n&bull; item 3']之类的任何想法?

最佳答案

这是一个基于非正则表达式的解决方案:

with open('/tmp/example.txt') as f:
  lines_in = f.readlines()

inside_block = False
lines_out = []

for line in lines_in:
  if line.startswith('&bull; '):
    if not inside_block:
      lines_out.append('<ul>\n')
      inside_block = True
    lines_out.append('<li>{}</li>\n'.format(line.strip().replace('&bull; ','')))
  else:
    if inside_block:
      lines_out.append('</ul>\n')
      inside_block = False
    lines_out.append(line)

print ''.join(lines_in)
print '-'*78
print ''.join(lines_out)


测试运行:

[~/Desktop]
|7>run /tmp/spam.py
spam
&bull; item 1
&bull; item 2
&bull; item 3
and eggs

------------------------------------------------------------------------------
spam
<ul>
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
</ul>
and eggs

09-19 06:06