我的字符串如下:
<p>The is a string.</p>
<em>This is another string.</em>
一次一行地从文本文件中读取它们。我想将这些分成单词。为此,我只是使用split()
分割字符串。
现在我有一组单词,但第一个单词将是<p>The
而不是The
。对于旁边有<>
的其他单词也是如此。我想从单词中删除<..>
。
我想在一行中这样做。我的意思是我希望像命令行一样传递<*>
形式的参数。我正在考虑使用replace()
函数来尝试这样做,但我不确定replace()
函数参数的样子。
例如,我如何更改<..>
以下方式,这意味着我想要包含<
和>
之间的任何内容:
x = x.replace("<..>", "")
答案 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.替换。下面的两个解决方案将向您展示如何一步完成。
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组的单词,我们知道它们是正确的,因为它们与左侧的表达不匹配。
参考
<[^>]+>|[ .]
在|
的左侧,我们使用<complete tags>
作为拆分分隔符。在右侧,我们使用空格字符或句点。
<强>输出强>
This
is
a
string