Python正则表达式实现可嵌套“因为……所以”字符串提取
本文介绍如何在Python中使用正则表达式提取包含“因为……所以”的文本,重点解决嵌套结构的查找问题。通过组嵌套技术构建复杂表达式,并展示具体的代码实现与输出格式,帮助开发者掌握正则表达式中分组嵌套的高级应用技巧。
近期遇到一个网络上的技术需求,要求利用正则表达式进行文本处理。具体需求描述如下:
目标是从文本中筛选出包含“因为……所以”结构的句子。输出时需以“因为”和“所以”两个词为中心,分别对齐输出其前后各3个字符,中间部分完整保留。若“因为”与“所以”之间还存在嵌套的“因为”或“所以”,需单独识别并另起一行输出。最终输出格式规定为:
行号 前3个字符 *因为* 中间内容 &所以& 后3个字符(标点符号计为一个字符)
示例输出:2 还不是 *因为* 这里好, &所以& 没有人
具体实现方案如下所示:
#encoding:utf-8
import os
import re
def getPairStriList(filename):
pairStrList = []
textFile = open(filename, 'r')
pattern = re.compile(u'.{3}\u56e0\u4e3a.*\u6240\u4ee5.{3}') #u'\u56e0\u4e3a和u'\u6240\u4ee5'分别为“因为”和“所以”的utf8码
for line in textFile:
utfLine = line.decode('utf8')
result = pattern.search(utfLine)
while result:
resultStr = result.group()
pairStrList.append(resultStr)
result = pattern.search(resultStr,2,len(resultStr)-2)
#对每个字符串进行格式转换和拼接
for i in range(len(pairStrList)):
pairStrList[i] = pairStrList[i][:3] + pairStrList[i][3:5].replace(u'\u56e0\u4e3a',u' *\u56e0\u4e3a* ',1) + pairStrList[i][5:]
pairStrList[i] = pairStrList[i][:len(pairStrList[i])-5] + pairStrList[i][len(pairStrList[i])-5:].replace(u'\u6240\u4ee5',u' &\u6240\u4ee5& ',1)
pairStrList[i] = str(i+1) + ' ' + pairStrList[i]
return pairStrList
if __name__ == '__main__':
pairStrList = getPairStriList('test.txt')
for str in pairStrList:
print str
补充说明:下文将详细解析在Python中如何利用正则表达式的组嵌套功能。
正则表达式中的分组本身就是一个完整的子表达式,因此支持将分组嵌套在其他分组内,从而构建更为复杂的匹配模式。以下示例展示了组嵌套的具体用法:
#python 3.6
#蔡军生
#http://blog.csdn.net/caimouse/article/details/51749579
#
import re
def test_patterns(text, patterns):
"""Given source text and a list of patterns, look for
matches for each pattern within the text and print
them to stdout.
"""
# Look for each pattern in the text and print the results
for pattern, desc in patterns:
print('{!r} ({})\n'.format(pattern, desc))
print(' {!r}'.format(text))
for match in re.finditer(pattern, text):
s = match.start()
e = match.end()
prefix = ' ' * (s)
print(
' {}{!r}{} '.format(prefix,
text[s:e],
' ' * (len(text) - e)),
end=' ',
)
print(match.groups())
if match.groupdict():
print('{}{}'.format(
' ' * (len(text) - s),
match.groupdict()),
)
print()
return
测试用例如下:
#python 3.6 #蔡军生 #http://blog.csdn.net/caimouse/article/details/51749579 # from re_test_patterns_groups import test_patterns test_patterns( 'abbaabbba', [(r'a((a*)(b*))', 'a followed by 0-n a and 0-n b')], )
程序运行结果如下:
'a((a*)(b*))' (a followed by 0-n a and 0-n b)
'abbaabbba'
'abb' ('bb', '', 'bb')
'aabbb' ('abbb', 'a', 'bbb')
'a' ('', '', '')
总结
以上介绍了在Python中使用正则表达式查找可嵌套字符串组的方法,希望能对读者有所帮助。如有任何疑问,欢迎留言交流,小编会及时回复。感谢大家对本网站的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













