【问题标题】:How to grab sentences separated by dashes如何抓取由破折号分隔的句子
【发布时间】:2012-11-06 21:37:10
【问题描述】:

如果用破折号分隔句子(表示语音),什么正则表达式会抓取这些句子?问题是有时这样的句子被插入到正常的句子中,因此两边都用破折号隔开。但其他时候,它们用破折号打开,用句号关闭。更重要的是,破折号并不总是用于衬托口语句子。我需要捕捉的部分放在括号中(对不起,句子是立陶宛语)。

[- Dilze, -] šaukė ji be jokios intonacijos, pabrėžtinumo ar skubos, tarsi nesitikėdama atsakymo. [- Dilze!]
Dilzė atsakė ir liovės barškinusi rykais, stovinčiais ant krosnies, bet dar nespėio pereit per virtuvę, kai ponia Kompson pašaukė dar kartą, o kol ji perėjo per valgomąjį ir kyštelėjo galvą į tą pilką lango šviesą, - dar vieną kartą.
[- Einu, einu, -] atsakė Dilzė. [- Aš čia. Pripilsiu ją, kai tik vanduo sušils, -] pasikaišė sijoną ir ėmė kopti laiptais, visai užstodama tą pilką šviesą. [- Padėkit ją antžemės ir grįžkite į lovą.]

【问题讨论】:

  • 您使用哪种语言或工具?你试过什么?

标签: python regex csv


【解决方案1】:

在 Python 中,re 不支持 Unicode 字符属性,但 regex 支持。

regex.findall 与模式一起使用

(?m)-\s*\p{Lu}.*?(?:-|[.,!?]\s*$)

【讨论】:

  • 我已编辑您的问题以包含编程语言。将来,请在您的原始问题中包含此内容,以便人们有更好的机会帮助您。
  • @Omega,我在 Python 等方面都是非常初学者。代码看起来像这样吗?import re filename="C:/Users/.../LITH.txt" fileobj =open(filename, "r") ptext=fileobj.read() fileobj.close() pat= ur'-\s*\p{Lu}.*?(?:-|[.,!?]\s *$)' m=re.compile(pat,re.MULTILINE | re.UNICODE) 打印 m
  • @gabrielemucho - 您不能将 Unicode 字符属性与 re 一起使用。使用模块正则表达式 (pypi.python.org/pypi/regex) >> regex.findall(r"(?m)-\s*\p{Lu}.*?(?:-|[.,!?]\s*$)", input)
  • 它返回:没有名为 regex 的模块
  • @gabrielemucho - 我在我的回答和之前的评论中提供了这个模块的链接,所以如果你没有安装它,从那个站点下载并安装它。我很抱歉,但我想我无能为力了。您必须自己安装模块...
【解决方案2】:

据我了解,您正在寻找匹配以 [- 开头并以 .] 结尾的任何内容的正则表达式,其中点可以是任何行结尾。

正则表达式\[\-.*?[\-\.\!]\] 执行此操作。 [\-\.\!] 部分定义了所有可以作为结尾 ] 前缀的字符。中间的问号确保正则表达式不是贪婪的,但是如果这对您有用,它是特定于正则表达式实现的。

【讨论】:

  • 我现在知道我希望您的括号出现在您的文本中。 \-.*?[\-\.\!] 应该可以工作。
  • 是的,我正在寻找一个正则表达式。但它不一定以.]结尾。它总是以 [- 开头,但可以以以下 4 个选项结尾:,-] 或 .] 或 !] 或 ?]
  • 嗨 Martijn,这个 \-.*?[\-\.\!] 与抓取文本中的第一个实例一样好,但不抓取其他字符串 :(.跨度>
  • 那么\[\-.*?[\-\.\!\?]\] 是一个可能的正则表达式。回答您的第二个问题:正则表达式有几种可能的用途。使用只返回第一个结果的函数就是其中之一。很可能有另一个函数返回所有找到的结果。
【解决方案3】:

我喜欢在带括号的情况下使用字符串操作而不是正则表达式。

>>> text = '''[- here is some text -] here is some not text [- that i want to get -]'''

>>> [sent.split('-]')[0] for sent in text.split('[-') if '-]' in sent]
[' here is some text ', ' that i want to get ']

text.split('[-') 拆分字符串 [-。列表理解将这些结果输入到第二个拆分中,在对立的括号上拆分。请注意,如果您有“浮动”括号,这将不起作用,但如果您正在操作某人手动输入的标记,这是一个很好、便宜(正则表达式很昂贵)的解决方案。这样,您不必担心安装模块。

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2017-12-10
    相关资源
    最近更新 更多