text = '''
《红楼梦》、《西游记》、《水浒传》和《三国演义》被誉为中国古代四大名著,
它们分别由曹雪芹、吴承恩、施耐庵和罗贯中所著,不仅在中国文学史上占有重要地位,
也在世界范围内产生了深远影响。这四部作品以其深刻的人物塑造、复杂的情节构造以及丰富的文化内涵,
展现了中国古代社会的多元面貌与深刻洞察。
'''
现在有一段文字,我需要提取出被书名号包裹的书名
很简单,封装一个简单的函数:
def getBooks(text):
books = []
curBook = ''
exitsBookName = False
for s in text:
if s == '《':
exitsBookName = True
elif s == '》':
exitsBookName = False
books.append(curBook)
curBook = ''
elif exitsBookName:
curBook += s
return books
books = getBooks(text)
print(books) #['红楼梦', '西游记', '水浒传', '三国演义']
其实还有更简单的方法,使用RegExp,在各种主流的编程语言中都支持正则表达式。
import re
books = re.findall(r'《.+?》', text)
print(books) #['《红楼梦》', '《西游记》', '《水浒传》', '《三国演义》']
这里匹配出了所有的书本名,但是我不需要书名号,怎么办呢?
使用map处理一遍数据:
books = list(map(lambda item: item[1:-1], books))print(book) #['红楼梦', '西游记', '水浒传', '三国演义']
但是我还是觉得这太麻烦了,可以把正则在改进一下。
先行断言:
a(?=b)
只有当a后面是个b的时候a才会被命中。
后行断言:
(?<=a)b
只有当b前面是个a的时候b才会被命中。
改进一下正则再匹配:
books = re.findall(r'(?<=》).+?(?=》)', text)
print(books) # ['红楼梦', '西游记', '水浒传', '三国演义']
先行断言和后行断言是需要包含,与之相反的正向否定查找和反向否定查找:
a(?!b) #a后面不是b的时候就会被命中
(?<!a)b #b前面不是a的时候就会被命中
相关文档:developer.mozilla.org/zh-CN/docs/…
--