1

HTMLを統一するために、不十分で一貫性のないフォーマットの製品記述を含む製品データベースを調べるスクリプトを書いています。私が抱えている問題の1つは、同じ方法でフォーマットされたコード行をキャプチャして置き換えることです。たとえば、私は彼らのすべてを交換したいです

• item 1
• item 2
• item 3

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

&bull;各行を1行に置き換えるの<li>content</li>は簡単ですが、リストの前後で取得できる正規表現を一生理解することはできません。私の考えは、で始まらない&bull;改行ができるまで、で始まるすべてをキャプチャすることです。これが私の最新の試みです(python):&bull;

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

最初にすべての箇条書きを<li>要素に変更する必要があり、次に2回目の実行でそれらを<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);

出力:

<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

内容を文字列に読み込み、「&bull;」で分割します。各要素の前後にそれぞれ「<li>」と「<\li>」を追加して、要素を繰り返し処理します。

于 2012-05-08T00:16:22.757 に答える