【问题标题】:findall all hyphenated words in greek text查找希腊文本中所有带连字符的单词
【发布时间】:2015-04-08 21:49:19
【问题描述】:

每次存在换行符时,我都有一个带有连字符的希腊文本。例如:

Καλημέρα ο καιρός είναι απίστευτος σή-
μερα και θα πάμε εκδρομή. Πρέπει να ετοι-
μασουμε πράγματα για πικ-νικ.

仅当插入换行符时,我才需要找到字符“-”之间的单词边界,以便将其删除并将换行符“\n”移动到去连字符的末尾。 我的结果应该是这样的:

Καλημέρα ο καιρός είναι απίστευτος σήμερα
και θα πάμε εκδρομή. Πρέπει να ετοιμασουμε
πράγματα για πικ-νικ.

我在python中使用正则表达式,我的命令是

re.findall(r'\b.*?-\n.*?\s', data, re.UNICODE)

获取边界之间的单词但结果是:

Καλημέρα ο καιρός είναι απίστευτος σή-
μερα

不仅仅是单词

σή-μερα

有谁知道我做错了什么?希腊字符有问题吗?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    你需要使用re.sub函数,

    >>> s = '''Καλημέρα ο καιρός είναι απίστευτος σή-
    μερα και θα πάμε εκδρομή. Πρέπει να ετοι-
    μασουμε πράγματα για πικ-νικ.'''
    >>> print(re.sub(r'-\n(\S+)\s+', r'\1\n', s))
    Καλημέρα ο καιρός είναι απίστευτος σήμερα
    και θα πάμε εκδρομή. Πρέπει να ετοιμασουμε
    πράγματα για πικ-νικ.
    

    DEMO

    \S+ 匹配一个或多个非空格字符,而\s+ 匹配一个或多个空格字符。 re.sub 函数将用替换部分中存在的字符替换所有匹配的字符。所以这个r'-\n(\S+)\s+' 正则表达式匹配连字符和后面的换行符以及跟在换行符后面的单词。 () 称为捕获组,用于捕获与捕获组中存在的模式匹配的字符。这里捕获组中存在的模式是 \S+ 。因此它匹配并捕获换行符后面的单词。您可以通过指定其组索引号来引用替换部分中捕获的字符。

    【讨论】:

      【解决方案2】:

      您可以使用此正则表达式进行搜索:

      \b(\w+)-\r?\n(\w+)\b
      

      并替换为:

      \1\2\n
      

      RegEx Demo

      代码:

      import re
      p = re.compile(ur'\b(\w+)-\r?\n(\w+)\b', re.UNICODE)
      
      result = re.sub(p, u"\1\2\n", input)
      

      【讨论】:

      • 非常感谢阿努巴瓦!有用!但是你能解释一下 \1\2\n 是什么意思吗?
      • 是的,当然。 \1 是对第一个匹配组的反向引用(连字符之前的单词),\2 是对第二个匹配组的反向引用(连字符和换行符之后的单词)。
      • 很抱歉我看到演示的问题,我理解替换!非常感谢@anubhava!
      • 没有问题,只要答案令您满意并且有清晰的理解就可以了 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多