代码之家  ›  专栏  ›  技术社区  ›  ytomo

如何使用正则表达式和python将文本提取限制到特定字符

  •  0
  • ytomo  · 技术社区  · 7 年前

    text = "Alun-alun/NNP Jombang/NNP tepatnya/RB Depan/IN SMP/NNP 2/CDP Jombang/NNP Besok/NNP pagi/NN :/: :/: :/: Minggu/NNP"
    

    我喜欢从标签中提取任何单词 /IN /NNP 标签

    Depan/IN SMP/NNP 2/CDP Jombang/NNP Besok/NNP pagi/NN :/: :/: :/: Minggu/NNP . 但如果代码满足以下任一条件,我希望它停止 /: 标签以下是目前为止的代码:

    import re
    
    def entityExtract(text):
        # text = re.findall(r'([^\s/]*/IN\b[^/]*(?:/(?!IN\b)[^/]*)*/NNP\b)', text)
        text = re.findall(r'([^\s/]*/IN\b[^/]*(?:/(?!IN\b)[^/]*)*/(?:NNP|CDP)\b)', text)
        return text
    
    text = "Alun-alun/NNP Jombang/NNP tepatnya/RB Depan/IN SMP/NNP 2/CDP Jombang/NNP Besok/NNP pagi/NN :/: :/: :/: Minggu/NNP"
    
    extract = entityExtract(text)
    
    print text
    print extract
    

    ['Depan/IN SMP/NNP 2/CDP Jombang/NNP Besok/NNP pagi/NN :/: :/: :/: Minggu/NNP']
    

    预期结果为:

    ['Depan/IN SMP/NNP 2/CDP Jombang/NNP Besok/NNP]
    

    2 回复  |  直到 7 年前
        1
  •  2
  •   kaza    7 年前

    [^\s/]*/IN\b([^/]*/(?!IN\b|:\b)[^\s^/]*\b)*[^/]*/NNP\b

    我和@DYZ一样困惑于你想停在哪里,所以我基于你的输出来编写正则表达式。
    我相信你想抽 'word/tag' word+tag

    您想在不包含标签的情况下将标签停在何处由该组控制 (?!IN\b|:\b|NN\b)

    检查正则表达式 here

        2
  •  1
  •   Marc Lambrichs user8588010    7 年前

    我已经看过了@bulbus和@ytomo在评论中显示的正则表达式的答案,即:

    [^\s/]*/IN\b[^/]*(?:/(?!IN\b|:\b)[^/]*\b)*/(?:NNP|CDP)\b
    

    [^\s/]*/IN\b[^/]* 我将简化为 \w+/IN\b example 1 .

    换句话说,你要解决的是:

    • 后跟任意数量的\s[^/]+/\w+组,这不是\b中的\w+/
    • ....您已匹配您可以找到的最后一个NNP或CDP组。

    把它直接翻译成正则表达式,你会得到一个更可读的版本。(JMHO)

    1. \w+/IN\b(\s[^/]+/[^\s]+) 在组中读取第一个组( example 2 )
    2. \w+/IN\b(\s[^/]+/[^\s]+)* 重复第二组( example 3
    3. \w+/IN\b(\s[^:/]+/(?!IN|:)[^\s]+)* 忽略组中的:/:和\w+/( example 4 )
    4. \w+/IN\b(\s[^:/]+/(?!IN|:)[^\s]+)*\s\w+/(NNP|CDP)\b example 5 )

    如果我们将这一结果与前面答案的评论中提出的@ytomo结果进行比较,似乎没有太大差异。然而,我甚至费心回答的原因是,正则表达式应该可读并且符合一些逻辑。你的代码明天将投入生产,当你的代码崩溃时,必须有人在一定的时间压力下进行检查。