【问题标题】:Regex to capture hyphenated words separated by new line character正则表达式捕获由换行符分隔的连字符
【发布时间】:2018-10-09 06:17:46
【问题描述】:

我有一个模式,例如 word-\nword,即单词是连字符并用换行符分隔的。

我希望输出为 word-word。我用下面的代码得到 word-\nword。

    text_string = "word-\nword"
    result=re.findall("[A-Za-z]+-\n[A-Za-z]+", text_string)
    print(result)

我试过了,但没有成功,我没有得到任何结果。

   text_string = "word-\nword"
   result=re.findall("[A-Za-z]+-(?=\n)[A-Za-z]+", text_string)
   print(result)

我怎样才能做到这一点。 谢谢!

编辑:

替换并运行一个简单的正则表达式是否有效

text_string = "aaa bbb ccc-\nddd eee fff"
replaced_text = text_string.replace('-\n', '-')
result = re.findall("\w+-\w+",replaced_text)
print(result) 

或使用CertainPerformance建议的方法

text_string = "word-\nword"
result=re.sub("(?i)(\w+)-\n(\w+)", r'\1-\2', text_string)
print(result)

【问题讨论】:

    标签: regex python-3.x regex-lookarounds


    【解决方案1】:

    您应该使用re.sub 而不是re.findall

    result = re.sub(r"(?<=-)\n+", "", test_str)
    

    这匹配- 之后的任何新行并将其替换为空字符串。

    Demo

    你也可以使用

    (?<=-)\n(?=\w)
    

    只有在 - 前面有一个 - 时才匹配新行并且它后面是单词字符。

    【讨论】:

      【解决方案2】:

      如果字符串仅由它组成,那么纯正则表达式解决方案是使用re.sub,捕获组中的第一个单词和第二个单词,然后回显这两个组(不带破折号和换行符):

      result=re.sub("(?i)([a-z]+)-\n([a-z]+)", r'\1\2', text_string)
      

      否则,如果字符串中有其他内容,则遍历每个匹配项并加入组:

      text_string = "wordone-\nwordtwo wordthree-\nwordfour"
      result=re.findall("(?i)([a-z]+)-\n([a-z]+)", text_string)
      for match in result:
          print(''.join(match))
      

      【讨论】:

      • 有效!非常感谢你。您能否非常简要地解释一下代码。不要得到 (?i) 部分。
      • 它使用i 标志(不区分大小写),因此您不必重复[A-Za-z],这会重复。每个单词都被捕获在一个组中(括号()),然后\1\2 将两个组回显给您,而没有其余的匹配。
      • 这是一个完整的文档。所以我想我会使用 result=re.sub("(?i)(\w+)-\n(\w+)", r'\1-\2', text_string),否则它会捕获之前的所有单词及之后。
      【解决方案3】:

      您可以简单地将任何出现的'-\n' 替换为'-'

      result = text_string.replace('-\n', '-')
      

      【讨论】:

      • 进行替换并运行简单的正则表达式是否有效? text_string = "aaa bbb ccc-\nddd eee fff" replace_text = text_string.replace('-\n', '-') 结果= re.findall("\w+-\w+",replaced_text) print(result) 或使用 "CertainPerformance" result=re.sub("(?i)(\w+)-\n(\w+) 建议的方法", r'\1-\2', text_string)
      猜你喜欢
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 2023-01-21
      相关资源
      最近更新 更多