在句子中找到刺痛的位置[刺痛的开始和结束]

时间:2017-05-29 15:21:46

标签: python

我在查找python中句子中字符串的位置时遇到了问题。我一直收到错误:不平衡的括号。

>>>sent="Of these the Murids (seekers or strugglers,) are formed"
>>>stringlist=sent.split()

>>>[[(m.start(0), m.end(0)) for m in re.finditer(s, sent)]for s in stringlist]

输出:

raise error, v # invalid expression
       error: unbalanced parenthesis

它没有字符串; (寻求者或斗争者);输出:[[(0, 2)], [(3, 8)], [(3, 6), (9, 12)], [(13, 19)], [(45, 48)], [(49, 55)]]

我的问题是如何找到所有字符串的开头和结尾; ['Of', 'these', 'the', 'Murids', '(seekers', 'or', 'strugglers,)', 'are', 'formed']包括带有不平衡括号的那个?

感谢您的建议。

2 个答案:

答案 0 :(得分:2)

(是正则表达式中的特殊字符。它标志着捕获组的开始。像这样)标志着捕获组的结束。因此,(seekersstrugglers,)都不会构成有效的正则表达式(在split()之后得到的正则表达式无效。

您应该转义()

sent = "Of these the Murids \(seekers or strugglers,\) are formed"

现在您的代码输出:

[[(0, 2)], [(3, 8)], [(3, 6), (9, 12)], [(13, 19)], [(21, 29)],
 [(30, 32), (52, 54)], [], [(47, 50)], [(51, 57)]]

另一个选择是使用re.escape似乎确实会返回更好的结果:

import re 

sent = "Of these the Murids (seekers or strugglers,) are formed"
stringlist = sent.split()

print([[(m.start(0), m.end(0)) for m in re.finditer(re.escape(s), sent)] for s in stringlist])
# [[(0, 2)], [(3, 8)], [(3, 6), (9, 12)], [(13, 19)], [(20, 28)],
#   [(29, 31), (50, 52)], [(32, 44)], [(45, 48)], [(49, 55)]]

答案 1 :(得分:0)

()[] $ ^ \。 | {}是python正则表达式的特殊字符。
尝试在每个括号前加\,得到你想要的结果
您的输出将是:

[[(0, 2)], [(3, 8)], [(3, 6), (9, 12)], [(13, 19)], 
[(21, 29)], [(30, 32), (52, 54)], [], [(47, 50)], [(51, 57)]]