我有以下字符串(请注意每个连字符前面有新空格):
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(r'', r'', string, 1)
)中添加一个数字会对该事件有所应用(在本例中是第一个,因为它是1)。修改
我希望语法适用于任何字符串,例如:
string = 'This is some text - Bullet 1\
- Bullet 2\
- Bullet 3\
- Bullet 4'
正如您所看到的,顶部有一些文本不在子弹形式中。此文本可能会有所不同,也可能在项目符号列表之后,因此语法必须与此一起使用。
答案 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>
>>>