正则表达式:捕获一组开头相同的行?

2024-06-17 12:38:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

• item 1
• item 2
• item 3

^{pr2}$

&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']之类的东西有什么想法吗?在


Tags: textinre脚本数据库产品格式li
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)

试运行:

^{pr2}$

将内容读入字符串,然后在“&bull;”上拆分。迭代元素,在每个元素之前和之后分别添加“<;li>;”和“<;\li>;”。在

首先必须将所有项目符号更改为<li>元素,然后在第二次执行时将它们包含在<ul>元素中。在

下面是一个java示例。Python还使用PCRE,因此它的工作方式应该相同:

    String test = "&bull; item 1\r\n&bull; item 2\r\n&bull; item 3\r\n";
    test = test.replaceAll("&bull; (.*)(?!^&bull;)", "<li>$1</li>");
    System.out.println(test);
    test = test.replaceAll("(?s)(<li>.+</li>)+?", "<ul>\n$1\n</ul>");
    System.out.println(test);

输出:

^{pr2}$

相关问题 更多 >