如果文字是
<textarea>
xyz asdf qwr </textarea>
我正在尝试编写正则表达式,以帮助我以粗体提取文本。
到目前为止,我已经到达了[(<textarea)][</textarea>)]
,它将捕获标签,但我还没能实际捕获两个标签之间的文本。
我也尝试了[(<textarea)]+.[</textarea>)]
甚至[[(<textarea)]+.[</textarea>)]
,但这也没有给出正确的结果。
有人可以对此有所了解或分享一些有助于我找到解决方案的链接吗?
答案 0 :(得分:3)
是否有特殊原因必须使用正则表达式来解析看似HTML的内容?我不会这样做。有关最佳说明,请参阅RegEx match open tags except XHTML self-contained tags。
如果您使用BeautifulSoup模块,这将变得非常简单,这将更好地解析HTML(特别是如果它是凌乱的HTML)。
import bs4
f = open("test.html")
soup = bs4.BeautifulSoup(f)
for textarea in soup.find_all('textarea'):
print textarea.get_text()
答案 1 :(得分:1)
你不应该用正则表达式解析HTML - 用HTML解析器解析它! See this answer
话虽如此,如果你必须使用正则表达式::
方括号[]
表示“匹配任何字符”,因此[<(textarea)]
表示“匹配&lt ;,(,t,e,x,t,a,r或)”。< / p>
你可能想要<textarea>(.*?)</textarea>
,第1组(第一组括号)是标签的内容。
如果用户在文本区域内写入"</textarea>"
,则会出现问题(例如);然后只提取"</textarea>"
的第一次出现。但是,如果你让它变得非贪婪并<textarea>.*</textarea>
,那么如果你有多个textarea
标签,那么.*
将匹配它们而不是单独匹配。这就是使用HTML正则表达式的缺陷。
答案 2 :(得分:1)
我认为您很难理解“+”和“*”运算符是指他们关注的模式,而不是他们之前的模式。
>>> import re
>>> re.match(r"\<textarea\>.*\<textarea/\>", target)
>>> re.match(r"\<textarea\>.*\</textarea>", target)
<_sre.SRE_Match object at 0x106528b90>
>>> mo = re.match(r"\<textarea\>.*\</textarea>", target)
>>> mo.groups()
()
>>> mo.group(0)
'<textarea> xyz asdf qwr </textarea>'
>>> mo = re.match(r"\<textarea\>(.*)\</textarea>", target)
>>> mo.groups()
(' xyz asdf qwr ',)
>>> mo.group(0)
'<textarea> xyz asdf qwr </textarea>'
>>> mo.group(1)
' xyz asdf qwr '
>>>
这有帮助吗?