【问题标题】:Java Regex, capturing groups with comma separated valuesJava Regex,使用逗号分隔值捕获组
【发布时间】:2011-01-18 05:46:57
【问题描述】:

InputString:士兵可能有瘀伤、伤口、痕迹、脱臼或其他伤害他的伤。

预期输出
瘀伤
伤口
标记
错位
受伤

广义模式尝试

 ".[\s]?(\w+?)"+ // 瘀伤。
      "(?:(\s)?,(\s)?(\w+?))*"+ // 伤口标记位错
      "[\s]?(?:or|and) 其他 (\w+)."; // 伤害

该模式应该能够匹配其他输入字符串,例如:一名士兵可能有瘀伤或其他伤害他的伤。

在尝试上面的广义模式时,输出是: 瘀伤 位错 受伤

“(?:(\s)?,(\s)?(\w+?))*”的捕获组有问题。捕获组又出现了一次..但它只返回“错位”。 “标记”和“错位”:被吞噬了。

您能否建议正确的模式应该是什么,错误在哪里? 这个问题最接近这个question,但那个解决方案没有帮助。

谢谢。

【问题讨论】:

  • 是什么让 bruiseswoundsmarksdislocationsInjuries 与其他词不同?前四个单词前后有一个逗号,但我看不出Injuries 是如何融入图片的。
  • 我正在尝试执行以下任务来实现模式以提取关系:NP {, NP} * {,} 其他 NP 瘀伤、伤口、脱臼或其他伤害...下位词(“瘀伤” ,"injuries"), hyponym("wound","injuries"), hyponym("dislocations", "injuries") 所以,我们可以看到“Injuries”配件是如何被满足的。
  • 当捕获组用量词注释时 [ie: (foo)*] 那么你只会得到最后一个匹配。如果您想获得所有这些,那么您需要在捕获中进行量化,然后您将不得不手动解析出这些值。尽管我是 regex 的忠实拥护者,但出于各种原因,我认为它不适合在这里......即使你最终没有做 NLP。
  • 谢谢@PSpeed:你是对的,这就是原因。虽然这是不合适的,但除了 java regex 之外没有其他选项。 (你有什么可以建议的吗?)““如果你想获得所有这些,那么你需要在捕获中进行量化”。应该如何修改以下正则表达式? (?:(\s)?,(\s)?(\w+?))*
  • 好吧,在这种情况下,量词基本上涵盖了整个正则表达式,您不妨使用 Matcher.find() 来逐步完成每个匹配项。另外,我很好奇为什么你有空白的捕获组。如果您要做的只是找到一组以逗号分隔的单词,那么就像: \w+(?:\s*,\s*\w+)* 然后不要打扰捕获组,只需拆分整个匹配。

标签: java regex csv capturing-group


【解决方案1】:

当捕获组使用量词 [ie: (foo)*] 进行注释时,您将只能获得最后一个匹配项。如果您想获得所有这些,那么您需要在捕获中进行量化,然后您将不得不手动解析出这些值。尽管我是 regex 的忠实拥护者,但出于各种原因,我认为它在这里不合适......即使你最终没有做 NLP。

如何解决:(?:(\s)?,(\s)?(\w+?))*

好吧,在这种情况下,量词基本上涵盖了整个正则表达式,您不妨使用 Matcher.find() 来逐步完成每个匹配项。另外,我很好奇为什么你有空白的捕获组。如果您要做的只是找到一组以逗号分隔的单词,那么就像: \w+(?:\s*,\s*\w+)* 然后不要打扰捕获组,只需拆分整个匹配。

对于任何更复杂的问题:NLP,GATE 是一个非常强大的工具。学习曲线有时很陡峭,但您可以借鉴整个行业的科学人员:http://gate.ac.uk/

【讨论】:

    【解决方案2】:

    正则表达式不适合(自然)语言处理。使用正则表达式,您只能匹配定义明确的模式。您真的应该放弃使用正则表达式执行此操作的想法。

    您可能想开始一个新问题,在其中指定您用于执行此任务的编程语言并在此处请求指针。

    编辑

    PSpeed 发布了一个指向第三方库Gate 的有前途的链接,该库能够执行许多语言处理任务。它是用 Java 编写的。我自己没有使用过它,但看看从事它的人/机构,它似乎很可靠。

    【讨论】:

    • 我完全同意你的看法。在文本处理方面,Perl 和 Python 可能是最好的。但工作是在java中。这项关于模式的工作是一个小的子模块。所以,需要在java中找到这个正则表达式问题的解决方案!
    • 好吧,我能说什么呢?确实没有可行的方法可以使用正则表达式从A soldier may have bruiser or other injuries that hurt him 等输入字符串中提取这些单词。真的。
    • 请注意,您不需要 Perl 或 Python。 Java 也可以做到这一点。正则表达式根本不适合这项工作。
    • 感谢您的建议。你能建议任何非正则表达式的java解决方案吗..
    • 这是一个非常好的工具,比如(可能不止)UIMA。谢谢!!
    【解决方案3】:

    有效的模式是:\w+(?:\s*,\s*\w+)* 然后手动分隔CSV Java Regex 没有其他方法可以做到这一点。

    理想情况下,Java 正则表达式不适用于 NLP。一个有用的文本挖掘工具是:gate.ac.uk
    感谢 Bart K. 和 PSpeed。

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多