1

我正在编写一个脚本来遍历产品数据库,其中产品描述格式不佳、格式不一致,以使其 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']

4

3 回答 3

1

You will first have to change all the bullets to <li> elements, then on a second execution encompass them in <ul> element.

Here is a java example. Python also uses PCRE so it should work the same:

    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);

Output:

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

<ul>
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
</ul>
于 2012-05-08T00:50:45.757 回答
1

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

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
于 2012-05-08T01:04:52.743 回答
0

将内容读入字符串并在“•”上拆分。遍历元素,分别在每个元素之前和之后添加“<li>”和“<\li>”。

于 2012-05-08T00:16:22.757 回答