正则表达式提取两个字符串(这是变量)

时间:2015-04-15 17:10:03

标签: python regex python-2.7

我希望使用正则表达式来提取两个字符串之间的文本。我知道怎么做如果我想每次都在相同的字符串之间提取(以及无数问题,例如Regex matching between two strings?),但我想使用变化的变量来做,并且可能在Regex中包含特殊字符。 (我想要任何特殊字符,例如*被视为文本)。

例如,如果我有:

text = "<b*>Test</b>"
left_identifier = "<b*>"
right_identifier = "</b>

我想创建正则表达式代码,这将导致运行以下代码:

re.findall('<b\*>(.*)<\/b>',text)

我不知道如何动态创建<b\*>(.*)<\/b>部分。

4 个答案:

答案 0 :(得分:5)

您可以这样做:

import re
pattern_string = re.escape(left_identifier) + "(.*?)" + re.escape(right_identifier)
pattern = re.compile(pattern_string)

转义功能会自动转义特殊字符。例如:

>>> import re
>>> print re.escape("<b*>")
\<b\*\>

答案 1 :(得分:4)

正则表达式以字符串形式开始,left_identifier + text + right_identifier并在re.compile中使用

或者:

re.findall('{}(.*){}'.format(left_identifier, right_identifier), text)

也有效。

如果您不希望元字符解释为这样,那么如果它们包含带有re.escape的正则表达式字符,则需要转义变量中的字符串:

>>> text = "<b*>Test</b>"
>>> left_identifier = "<b*>"
>>> right_identifier = "</b>"
>>> s='{}(.*?){}'.format(*map(re.escape, (left_identifier, right_identifier)))
>>> s
'\\<b\\*\\>(.*?)\\<\\/b\\>'
>>> re.findall(s, text)
['Test']

另一方面,str.partition(var)是另一种方法:

>>> text.partition(left_identifier)[2].partition(right_identifier)[0]
'Test'

答案 2 :(得分:4)

您需要re.escape标识符:

>>> regex = re.compile('{}(.*){}'.format(re.escape('<b*>'), re.escape('</b>')))
>>> regex.findall('<b*>Text</b>')
['Text']

答案 3 :(得分:0)

我知道你真的想要一个正则表达式解决方案,但我真的想知道正则表达式是否是we all have taken oath not to的正确工具。在解析html字符串时,我总是建议回到beautifulsoup

>>> import bs4
>>> bs4.BeautifulSoup('<b*>Text</b>').text
u'Text'