用正则表达式形成无序列表

时间:2015-06-26 21:24:23

标签: python regex

我有以下字符串(请注意每个连字符前面有新空格):

string = '  - Bullet 1\
  - Bullet 2\
  - Bullet 3\
  - Bullet 4'

我想用python和regex替换它,所以它是一个像这样的HTML列表:

<ul>
    <li>Bullet 1</li>
    <li>Bullet 2</li>
    <li>Bullet 3</li>
    <li>Bullet 4</li>
</ul>

正如您所看到的,我想用<li></li>标签替换每个项目符号,然后用<ul></ul>标记包装它们。

字符串并不总是保持不变,所以我更希望是否有办法识别第一个项目符号列表项以放置第一个<ul>,然后一种方法来识别最后一个项目符号列表项,然后包括</ul>

我尝试过的不起作用的事情:

  • re.sub(r'(\ \ -\ (.*?))', r'<li>\1</li>', string)
  • 我读到在re.sub(如re.sub(r'', r'', string, 1))中添加一个数字会对该事件有所应用(在本例中是第一个,因为它是1)。

修改

我希望语法适用于任何字符串,例如:

string = 'This is some text  - Bullet 1\
  - Bullet 2\
  - Bullet 3\
  - Bullet 4'

正如您所看到的,顶部有一些文本不在子弹形式中。此文本可能会有所不同,也可能在项目符号列表之后,因此语法必须与此一起使用。

3 个答案:

答案 0 :(得分:2)

假设每条线上的项目符号如下:

>>> string = '''This is some normal text
  - Bullet 1
  - Bullet 2
  - Bullet 3
  - Bullet 4
This is other text at the end'''

另一个没有周围文字的项目符号列表:

>>> string2 = '''  - Bullet 1
  - Bullet 2
  - Bullet 3
  - Bullet 4'''

通过两个简单的替换,您也可以在普通文本的中间替换项目符号:

def htmlize(txt):
    return re.sub('  - ([^\n]*)', r'<li>\1</li>',
        re.sub('((  - [^\n]*(\n|$))+)', r'<ul>\n\1\n</ul>', txt))

试验:

>>> htmlize(string)
'This is some normal text\n<ul>\n<li>Bullet 1</li>\n<li>Bullet 2</li>\n<li>Bullet 3</li>\n
<li>Bullet 4</li>\n\n</ul>This is other text at the end'
>>> htmlize(string2)
'<ul>\n<li>Bullet 1</li>\n<li>Bullet 2</li>\n<li>Bullet 3</li>\n<li>Bullet 4</li>\n</ul>'

编辑:

>>> string3 = 'This is some text to introduce the bullet points:\n  - This is the first bullet points\n  - This is the second bullet point\n  - This is the third bullet point\nThis some last bit of text.'
>>> htmlize(string3)
'This is some text to introduce the bullet points:\n<ul>\n<li>This is the first bullet points</li>\n<li>This is the second bullet point</li>\n<li>This is the third bullet point</li>\n\n</ul>This some last bit of text.'

答案 1 :(得分:0)

string = '''  - Bullet 1
  - Bullet 2
  - Bullet 3
  - Bullet 4'''

newstring = [line[4:].join(['<li>', '</li>']) if
             line.startswith('  - ') else line for line in string.split('\n')]

结果:

>>> print(*newstring, sep='\n')
<li>Bullet 1</li>
<li>Bullet 2</li>
<li>Bullet 3</li>
<li>Bullet 4</li>

答案 2 :(得分:0)

如何首先从每个Bullet中提取所需的每个项目(例如),然后将返回的列表加入到您需要的表单中,这样:

s = 'This is some text  - Bullet 1\
  - Bullet 2\
  - Bullet 3\
  - Bullet 4 And some text here'

r = re.findall(r'\w+\s+\d+', s) #Get all items from your `string`
in_Block = ['   '+t.join(['<li>','</li>']) for t in r] #join your items to construct inside block
out_Block = '\n'.join(in_Block).join(['<li>\n','\n</li>']) #Form the Outer Block
>>> print out_Block
<li>
   <li>Bullet 1</li>
   <li>Bullet 2</li>
   <li>Bullet 2</li>
   <li>Bullet 4</li>
</li>
>>>