如果我表明我的意思会更好。
以下是我正在解析的数据集中的一些选择:
1.【ひろゆき】万能ねぎとわけぎと記憶力。Grimbergen blondeを呑みながら。2020/12/18 V23
2.【ひろゆき】日本酒は鮮度が大事ですよ。獺祭を呑みながら 2019/02/11
3.【ひろゆき】聞かれたことに答えてみようの回。柴郡巧克力波特飲みつつ。
4.【ひろゆき】早起きは得しないし、体に悪いよね。。拉古尼塔斯国际音标を呑みながら 2019/04/14 D23
我正试图抓住贝弗莱吉的名字。在 1 中它是"格里姆伯根 金发女郎",在 2 "獺祭"中是 3 中是"柴郡巧克力波特",在 4 中 它是"拉古尼塔斯国际音标">
我尝试使用以下模式:
pattern = re.compile('(?<=[?。!]).*(?=を[飲呑])')
我看到饮料总是紧随其后的是を
或呑
/飲
.我还看到饮料总是在。
或?
之后立即.
如何做到这一点?
我们可以在展望中使用or
语句的[|]
来检查以下两个字符中的任何一个。
re.findall(r'(?<=。)[^。].*(?=[を|飲])', string)
#['Grimbergen blonde', ' 獺祭', 'Cheshire Chocolate Porter', 'Lagunitas IPA']
<小时 />细分
(?<=。)
- 在我们搜索之前检查是否发生。
,看看后面。[^。].*
- 匹配所有不包括。
这解释了拉古尼塔斯之前的双。。
(?=[を|飲])
- 向前看,看看是否有任何角色直接跟随我们的比赛
您可以在此处找到进一步的细分
[EDIT]
请您尝试以下操作:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
import sys, codecs
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
str = u"""
1.【ひろゆき】万能ねぎとわけぎと記憶力。Grimbergen blondeを呑みながら。2020/12/18 V23
2.【ひろゆき】日本酒は鮮度が大事ですよ。 獺祭を呑みながら 2019/02/11
3.【ひろゆき】聞かれたことに答えてみようの回。Cheshire Chocolate Porter飲みつつ。
4.【ひろゆき】早起きは得しないし、体に悪いよね。。Lagunitas IPAを呑みながら 2019/04/14 D23
5.【ひろゆき】冬将軍強くね?温暖化どこいったの? PARISIS NOËLを呑みつつ 2019/01/26
6.【ひろゆき】運のいい人っているよね。科学的根拠ないけど。。LA VIRGEN MADRID LAGERを呑みながら 2020/01/16 J08
"""
m = re.finditer(ur'.*[。?]+s?(.*?)を?[呑飲]', str)
for i in m:
print(i.group(1))
结果:
Grimbergen blonde
獺祭
Cheshire Chocolate Porter
Lagunitas IPA
PARISIS NOËL
LA VIRGEN MADRID LAGER
正则表达式'.*[。?]+s?(.*?)を?[呑飲]'
的解释:
- 前
.*
尽可能长时间地匹配,然后回溯以尝试以下正则表达式匹配。 [。?]+
匹配一个或多个日语句点或问号序列。s?
匹配空白字符(如果有)。它删除了前导空格 在饮料名称之前。(.*?)
中的?
可实现最短(非贪婪)匹配和 捕获组将分配给匹配的子字符串。を?
匹配字符"を"(如果有的话),考虑到这种情况 后置助词"を"在Japasene中有时会被省略。[呑飲]
匹配汉字变体的任一字符 意思是"喝酒"。
在上一篇文章中,领先的.*
缺失并允许超额匹配。 现在正则表达式一次尽可能增加指针,然后回溯 从右到左。这就是为什么现在删除不必要的子字符串的原因。