Python中的正则表达式匹配问题

时间:2016-07-23 23:24:08

标签: python regex python-2.7

对于输入字符串,想要匹配以{(P)开头并以(P)}结尾的文本,我只想匹配中间的部分。想知道我们是否可以编写一个正则表达式来解决这个问题?

例如,在以下示例中,对于输入字符串,我想要检索 hello world 部分。使用Python 2.7。

python {(P)hello world(P)} java

3 个答案:

答案 0 :(得分:4)

您可以尝试{\(P\)(.*)\(P\)},并在模式中使用括号来捕捉{(P)(P)}之间的所有内容:

import re
re.findall(r'{\(P\)(.*)\(P\)}', "python {(P)hello world(P)} java")

# ['hello world']

.*也匹配unicode字符,例如:

import re
str1 = "python {(P)£1,073,142.68(P)} java"
str2 = re.findall(r'{\(P\)(.*)\(P\)}', str1)[0]

str2
# '\xc2\xa31,073,142.68'

print str2
# £1,073,142.68

答案 1 :(得分:3)

您可以使用正向环视来确保它仅在文本前面和后面跟着开始和结束标记时才匹配。例如,您可以使用此模式:

(?<={\(P\)).*?(?=\(P\)})

请参阅demo

  • (?<={\(P\)) - 后面的表达式表明匹配必须以{(P)开头。
  • .*? - 匹配开始和结束标记之间的所有文本。 ?使得明星变得懒惰(即非贪婪)。这意味着它将尽可能少地匹配。
  • (?=\(P\)}) - 前瞻性表达式,指出匹配必须后跟(P)}

对于它的价值,懒惰模式在技术上效率较低,所以如果你知道匹配中没有(个字符,最好使用负字符类:< / p>

(?<={\(P\))[^(]*(?=\(P\)})

答案 2 :(得分:2)

您也可以在没有正则表达式的情况下执行此操作:

s = 'python {(P)hello world(P)} java'
r = s.split('(P)')[1]
print(r)
# 'hello world'