在字符串的两个定界符之间搜索字符

时间:2019-05-20 21:59:32

标签: python html string

我正在尝试解析一个字符串,以查找两个定界符<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>之间的特殊字符有关,但我不知道如何解决。谢谢您的帮助!

3 个答案:

答案 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>