【发布时间】:2016-11-27 14:05:36
【问题描述】:
对于输入字符串,要匹配以{(P) 开头并以(P)} 结尾的文本,我只想匹配中间的部分。想知道我们是否可以编写一个正则表达式来解决这个问题?
例如,在以下示例中,对于输入字符串,我要检索 hello world 部分。使用 Python 2.7。
python {(P)hello world(P)} java
【问题讨论】:
标签: python regex python-2.7
对于输入字符串,要匹配以{(P) 开头并以(P)} 结尾的文本,我只想匹配中间的部分。想知道我们是否可以编写一个正则表达式来解决这个问题?
例如,在以下示例中,对于输入字符串,我要检索 hello world 部分。使用 Python 2.7。
python {(P)hello world(P)} java
【问题讨论】:
标签: python regex python-2.7
您可以尝试{\(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
【讨论】:
(P)之间有ASCII,就可以成功输出。但是如果中间有unicode字符,输出(我用print re.findall(r'{\(P\)(.*)\(P\)}', "python {(P)hello world(P)} java")输出)会很奇怪,比如['\xe5\x8e\],有什么想法在使用print输出时将它们转换回unicode字符?
re.findall 返回所有匹配项的列表。
你也可以不使用正则表达式:
s = 'python {(P)hello world(P)} java'
r = s.split('(P)')[1]
print(r)
# 'hello world'
【讨论】:
{ 和 } 的要求怎么样?!您的代码适用于 示例,但无法回答问题
您可以使用肯定的环视来确保它仅在文本之前和之后是开始和结束标记时匹配。例如,您可以使用以下模式:
(?<={\(P\)).*?(?=\(P\)})
请参阅demo。
(?<={\(P\)) - 后向表达式指出匹配必须以 {(P) 开头。.*? - 匹配开始和结束标签之间的所有文本。 ? 使明星变得懒惰(即不贪婪)。这意味着它将尽可能少地匹配。(?=\(P\)}) - 表示匹配必须后跟 (P)} 的前瞻表达式。不管怎样,惰性模式在技术上效率较低,所以如果你知道匹配中不会有 ( 字符,最好使用否定字符类:
(?<={\(P\))[^(]*(?=\(P\)})
【讨论】:
? 开头?
(?<= ... ) 创建一个积极的后视。 (?= ... ) 创建一个积极的前瞻性。通过使用环视表达式,您可以声明某些事物必须在匹配之前或之后出现,而无需将它们实际包含在匹配中。
(P)之间有ASCII,就可以成功输出。但是如果中间有unicode字符,输出(我用print re.findall(r'(?<={\(P\)).*?(?=\(P\)})', utf-8-string-to-pass)输出)会很奇怪,比如['\xe5\x8e\],有什么想法在使用print输出时将它们转换回unicode字符?