在左右边界内搜索短语



如果我表明我的意思会更好。

以下是我正在解析的数据集中的一些选择:

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']
<小时 />

细分

  1. (?<=。)- 在我们搜索之前检查是否发生,看看后面。
  2. [^。].*- 匹配所有不包括这解释了拉古尼塔斯之前的双。。
  3. (?=[を|飲])- 向前看,看看是否有任何角色直接跟随我们的比赛

您可以在此处找到进一步的细分

[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中有时会被省略。
  • [呑飲]匹配汉字变体的任一字符 意思是"喝酒"。

在上一篇文章中,领先的.*缺失并允许超额匹配。 现在正则表达式一次尽可能增加指针,然后回溯 从右到左。这就是为什么现在删除不必要的子字符串的原因。

最新更新