我正在尝试解析一个字符串,以查找两个定界符<code>
和</code>
之间的所有字符。
我尝试使用正则表达式,但似乎无法理解发生了什么。
我的尝试:
import re
re.findall('<code>(.*?)</code>', processed_df['question'][2])
其中processed_df['question'][2]
是字符串(此字符串是连续的,为便于阅读,我将其键入多行):
'<code>for x in finallist:\n matchinfo =
requests.get("https://api.opendota.com/api/matches/{}".format(x)).json()
["match_id"]\n print(matchinfo)\n</code>'
我已经用以下test_string测试过:
test_string = '<code> this is a test </code>'
,它似乎有效。
我觉得它与<code>
和</code>
之间的特殊字符有关,但我不知道如何解决。谢谢您的帮助!
答案 0 :(得分:2)
我认为问题在于换行符\ n,请确保使用DOTALL
标志(例如
import re
regex = r"<code>(.*)\<\/code>"
test_str = ("<code>for x in finallist:\\n matchinfo = \n"
" requests.get(\"https://api.opendota.com/api/matches/{}\".format(x)).json() \n"
" [\"match_id\"]\\n print(matchinfo)\\n</code>\n")
re.findall(regex, test_str, re.DOTALL)
'for x in finallist:\\n matchinfo = \n requests.get("https://api.opendota.com/api/matches/{}".format(x)).json() \n ["match_id"]\\n print(matchinfo)\\n'
答案 1 :(得分:2)
使用html解析器可能比使用正则表达式更好
import lxml.html
html_snippet = """
...
<p>Some stuff</p>
...
<code>for x in finallist:\n matchinfo =
requests.get("https://api.opendota.com/api/matches/{}".format(x)).json()
["match_id"]\n print(matchinfo)\n</code>
...
And some Stuff
...
another code block <br />
<code>
print('Hello world')
</code>
"""
dom = lxml.html.fromstring(html_snippet)
codes = dom.xpath('//code')
for code in codes:
print(code.text)
>>>> for x in finallist:
>>>> matchinfo =
>>>> requests.get("https://api.opendota.com/api/matches/{}".format(x)).json()
>>>> ["match_id"]
>>>> print(matchinfo)
>>>> print('Hello world')
答案 2 :(得分:1)
因此,该问题并没有明确说明它需要regular expresions
。话虽如此,我会说最好不要使用它们:
例如
test_str = '''
<code>asldkfj
asdlkfjas
asdlkf
for i in range(asdlkf):
print("Hey")
if i == 8:
print(i)
</code>
'''
start = len('<code>')
end = len('</code>')
new_str = test_str.strip()[start:-end] # Should have everything in between <code></code>