【问题标题】:How can I match exact word of text using reg.compile如何使用 reg.compile 匹配文本的确切单词
【发布时间】:2019-06-04 23:13:01
【问题描述】:

我想为这样的确切单词找到一个模式(WITH RE.COMPILE),

想象这样的词 [以太、高度、远日点、西]

哪种捕获词或带标点符号的词,以一种我可以在spacy中使用的方式,我使用了这个但是它不起作用






regex_patterns = [

re.compile(r'aether?,|altitude?,|aphelion?,|apside?,|apsis?,|ascension?,|autumnal equinox?,|east?.|eastward?,|eclipse?,|ecliptic?,|elliptical?,|epicycle?,|equinoctical?,|exquinox?,|fixed star?,|latitude?,|longitude?s|mean ecliptic?,|meridian?,|mobile star?,|node?,|nodes?,|north?,|octant?,|orbit?,|\borbital?,|\bparallax?,|\brays?,|\bretrograde?,|rise?,|sidereal?,|sidereal position?,|solstice?,|south?,|star?,|vernal equinox?,|west?,')
                                          ]

如果正则表达式捕获“单词”和“单词”,那就太好了(单词+标点符号) 就像这句话一样

“西,可以看看”

结果应该是

西部,

【问题讨论】:

  • 它应该是,?作为可选的逗号,而不是?,
  • 在 spacy 中如何使用它?请说清楚。 Spacy 有一个分词器,可以以复杂的方式处理文本。您是否尝试为自定义标记器设置例外?
  • 你认为单词的边界是什么?正则表达式提供\b,这是从\w\W,或从\W\w 的转换。 \w = [a-zA-Z0-9_]\W 正好相反。

标签: python regex


【解决方案1】:

如果我们希望匹配特定的单词,我们可能希望从类似于以下的表达式开始:

(aether|altitude|aphelion|apside|apsis|ascension|autumnal equinox|east|eastward|eclipse|ecliptic|elliptical|epicycle|equinoctical|exquinox|fixed star|latitude|longitudes?|mean ecliptic|meridian|mobile star|nodes?|north|octant|orbit|\borbital\b|\bparallax\b|\brays\b|\bretrograde\b|rise|sidereal|sidereal position|solstice|south|star|vernal equinox|west),?

Demo 1

然后通过在 char 类中添加我们想要的标点符号来修改它:

[,:;\.]?

我们的表达式可能会变成:

(aether|altitude|aphelion|apside|apsis|ascension|autumnal equinox|east|eastward|eclipse|ecliptic|elliptical|epicycle|equinoctical|exquinox|fixed star|latitude|longitudes?|mean ecliptic|meridian|mobile star|nodes?|north|octant|orbit|\borbital\b|\bparallax\b|\brays\b|\bretrograde\b|rise|sidereal|sidereal position|solstice|south|star|vernal equinox|west)[,:;\.]?

Demo 2

测试

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(aether|altitude|aphelion|apside|apsis|ascension|autumnal equinox|east|eastward|eclipse|ecliptic|elliptical|epicycle|equinoctical|exquinox|fixed star|latitude|longitudes?|mean ecliptic|meridian|mobile star|nodes?|north|octant|orbit|\borbital\b|\bparallax\b|\brays\b|\bretrograde\b|rise|sidereal|sidereal position|solstice|south|star|vernal equinox|west),?"

test_str = ("aether\n"
    "altitude\n"
    "aphelion\n"
    "apside\n"
    "apsis\n"
    "ascension\n"
    "autumnal equinox\n"
    "east?.\n"
    "eastward\n"
    "eclipse\n"
    "ecliptic\n"
    "elliptical\n"
    "epicycle\n"
    "equinoctical\n"
    "exquinox\n"
    "fixed star\n"
    "latitude\n"
    "longitude\n"
    "longitudes\n"
    "mean ecliptic\n"
    "meridian\n"
    "mobile star\n"
    "node\n"
    "nodes\n"
    "north\n"
    "octant\n"
    "orbit\n"
    "orbital\n"
    "parallax\n"
    "rays\n"
    "retrograde\n"
    "rise\n"
    "sidereal\n"
    "sidereal position\n"
    "solstice\n"
    "south\n"
    "star\n"
    "vernal equinox\n"
    "west")

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

【讨论】:

  • 非常感谢您快速正确的回复,我根据您的使用了这个
【解决方案2】:

试试这个正则表达式:

'(word|other|foo|bar)+[\,\.]?'

这将 匹配 wordword,foofoo, 以及带有和不带有标点符号 ,. 或其他您添加的其他词.

【讨论】:

  • 我认为您可以省略捕获组的量词+,因为该组将包含最后一次迭代的值。第 1 组将在 otherword 中仅包含 word,完整匹配将是 otherword regex101.com/r/XGTPNW/1
【解决方案3】:
label = "PLAN"
texts = texts 
regex_patterns = [
re.compile(r'(\bAldebaran\b|\bAlphard\b|\bAntares\b|\bArcturus\b|\bBack of Leo\b|\bBeta Leonis\b|\bBeta Scorpii\b|\bBeta Tauri\b|\bBetelgeuse\b|\bcanis\b|\bCanis Minor\b|\bCor Leonis,7\b|\bCor Leonis\b|\bCor Scorpii,10\b|\bCor Scorpii\b|\bDenebola\b|\bdog\b|\bEpsilon Virginis\b|\bErichthonius\b|\bAldebaran\b|\bAlphard|\bAntares\b|\bArcturus\b|\bBack of Leo\b|\bBeta Leonis\b|\bBeta Scorpii\b|\b\Beta Tauri\b|\bBetelgeuse\b|\bcanis\b|\bCanis Minor\b|\bCor Leonis,7\b|\bCor Leonis\b|\bCor Scorpii\b|\bDenebola\b|\bdog\b|\bEpsilon Virginis\b|\bErichthonius\b|\bDenebola\b|\bdog\b|\bEpsilon Virginis\b|\bErichthonius\b|\bHeart of Hydra,8|\bHeart of Hydra\b|\bHydrae\b|\bKappa Geminorum\b|\bLambda Leonis\b|\bNeck of Leo\b|\bOrion\b|\bPalilicium\b|\bPolaris\b|\bPollux\b|\bProcyon\b|\bRegulus\b|\bSpica Virginis\b|\bTail of Leo\b|\bUrsa\b|\bUrsa Major\b|\bVindemiatrix\b|\bZeta Leonis\b)[:,]?')
]

当我遇到双重标点符号(或不一致)时,我捕捉到了所有像这里这样的词:

\bCor Scorpii,10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2019-10-23
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多