从python中的字符串中删除可变长度字符

时间:2014-07-19 21:04:36

标签: python regex string

我的字符串如下:

<p>The is a string.</p>
<em>This is another string.</em>

一次一行地从文本文件中读取它们。我想将这些分成单词。为此,我只是使用split()分割字符串。

现在我有一组单词,但第一个单词将是<p>The而不是The。对于旁边有<>的其他单词也是如此。我想从单词中删除<..>

我想在一行中这样做。我的意思是我希望像命令行一样传递<*>形式的参数。我正在考虑使用replace()函数来尝试这样做,但我不确定replace()函数参数的样子。

例如,我如何更改<..>以下方式,这意味着我想要包含<>之间的任何内容:

x = x.replace("<..>", "")

2 个答案:

答案 0 :(得分:3)

不幸的是,str.replace不支持正则表达式模式。您需要使用re.sub

>>> from re import sub
>>> sub("<[^>]*>", "", "<p>The is a string.</p>")
'The is a string.'
>>> sub("<[^>]*>", "", "<em>This is another string.</em>")
'This is another string.'
>>>

[^>]*匹配零个或多个不是>的字符。

答案 1 :(得分:2)

无需两步解决方案

你不需要1.拆分然后2.替换。下面的两个解决方案将向您展示如何一步完成。


选项1:匹配所有而不是分割

Match All and Split are Two Sides of the Same Coin,在这种情况下,匹配所有内容更安全:

<[^>]+>|(\w+)

单词将在第1组中。

像这样使用:

subject = '<p>The is a string.</p><em>This is another string.</em>'
regex = re.compile(r'<[^>]+>|(\w+)')
matches = [group for group in re.findall(regex, subject) if group]
print(matches)

<强>输出

['The', 'is', 'a', 'string', 'This', 'is', 'another', 'string']

<强>讨论

此问题是此问题中向"regex-match a pattern, excluding..."

解释的技术的典型案例

交替|的左侧匹配完成<tags>。我们将忽略这些匹配。右侧匹配并捕获第1组的单词,我们知道它们是正确的,因为它们与左侧的表达不匹配。

参考

选项2:单一拆分

<[^>]+>|[ .]

|的左侧,我们使用<complete tags>作为拆分分隔符。在右侧,我们使用空格字符或句点。

<强>输出

This
is
a
string