【问题标题】:Insert enter marks before the selected word在所选单词之前插入输入标记
【发布时间】:2020-10-05 15:14:19
【问题描述】:

我需要在每个新单词开始之前在字符串之间插入换行符(输入标记)。

字符串:

test (n) trial, experiment, check run (v) race, rush speed (n) race, sprint, rush, dash, zoom

预期:

test (n) trial, experiment, check 
run (v) race, rush 
speed (n) race, sprint, rush, dash, zoom

这个正则表达式选择括号之前的单词。但是如何在正确的位置插入回车标记呢?

\w+(?=\s+((.*?)))


更新:

答案不适用于我需要处理的实际字符串。 unicode 字符串是否被正则表达式区别对待?

import re

regex = r"(\w+)(?= (?:[()])).*?"

test_str = "खत (स्त्री) पाहा : भेट मुलगा (पु) पोर‚ पोरगा‚ पोरटा‚  कारटा‚ किशोर‚ कुमार‚ कुमारिका‚ तरुण; लग्नाचा/उपवधू मुलगा; पाहा : पुत्र ‚ पुरुष (n) boy, lad, kid, urchin; पाहा : पुत्र ‚ पुरुष मुलगी (स्त्री) पोर‚ पोरगी‚ पोरटी‚ बाला‚ बाळा‚ बालिका‚ छोकरी‚ छोटी‚ बेटी‚ कारटी‚ नग्निका‚"

subst = "\\n\\1"

result = re.sub(regex, subst, test_str , 0, re.MULTILINE)

if result:
    print (result)

第一个换行符是正确的“\nखत”,但第二个换行符是错误的“पुरु\nष”。第三个和第四个都不见了。

预期:

खत (स्त्री) पाहा : भेट 
मुलगा (पु) पोर‚ पोरगा‚ पोरटा‚  कारटा‚ किशोर‚ कुमार‚ कुमारिका‚ तरुण; लग्नाचा/उपवधू मुलगा; पाहा : पुत्र ‚ 
पुरुष (n) boy, lad, kid, urchin; पाहा : पुत्र ‚ पुरुष 
मुलगी (स्त्री) पोर‚ पोरगी‚ पोरटी‚ बाला‚ बाळा‚ बालिका‚ छोकरी‚ छोटी‚ बेटी‚ कारटी‚ नग्निका‚

【问题讨论】:

  • 请解释一下你是如何识别一个新词的?
  • 括号前的词是新词
  • this 有帮助吗?
  • 用 unicode 字符串示例更新了我的问题。

标签: python regex unicode python-unicode


【解决方案1】:

你可以试试:

\s+([^(\s]+\s+(?=\(.*?\)))

Online Demo


  • \s+ - 一个空格字符,一次或多次。为了防止以后出现尾随空格。
  • ( - 打开第一个捕获组。
  • [^(\s]+ - 否定字符类:没有左括号或空白字符,一次或多次。
  • \s+ - 一个空格字符,一次或多次。
  • (?=\(.*?\))- 文字左括号的正向前瞻,换行符以外的任何字符零次或多次(惰性)和文字右括号。
  • ) - 关闭第一个捕获组。

作为替代方案,可以尝试使用 regex 模块而不是 re 并尝试以下模式:

((?<=\s+)[\p{Devanagari}\p{L}]+(?=\s*\(.*))

  • \s+( - 一个或多个空格并打开第一个捕获组。这是为了防止我们稍后添加换行符时出现尾随空格。
  • (?&lt;=\s+) - 正向查找空白字符(以防止开始字符串)。
  • [\p{Devanagari}\p{L}]+ - 任何一个或多个梵文或来自任何语言的任何类型的字母的字符类。
  • (?=\s*\(.*) - 文字左括号的正向前瞻,零个或多个字符,换行符除外。
  • ) - 关闭第一个捕获组。

Python 代码:

import regex
test_str = "खत (स्त्री) पाहा : भेट मुलगा (पु) पोर‚ पोरगा‚ पोरटा‚  कारटा‚ किशोर‚ कुमार‚ कुमारिका‚ तरुण; लग्नाचा/उपवधू मुलगा; पाहा : पुत्र ‚ पुरुष (n) boy, lad, kid, urchin; पाहा : पुत्र ‚ पुरुष मुलगी (स्त्री) पोर‚ पोरगी‚ पोरटी‚ बाला‚ बाळा‚ बालिका‚ छोकरी‚ छोटी‚ बेटी‚ कारटी‚ नग्निका‚"
str_new = regex.sub(r'\s+((?<=\s+)[\p{Devanagari}\p{L}]+(?=\s*\(.*))', r'\n\1', test_str)

print(str_new)

打印:

खत (स्त्री) पाहा : भेट
मुलगा (पु) पोर‚ पोरगा‚ पोरटा‚  कारटा‚ किशोर‚ कुमार‚ कुमारिका‚ तरुण; लग्नाचा/उपवधू मुलगा; पाहा : पुत्र ‚
पुरुष (n) boy, lad, kid, urchin; पाहा : पुत्र ‚ पुरुष
मुलगी (स्त्री) पोर‚ पोरगी‚ पोरटी‚ बाला‚ बाळा‚ बालिका‚ छोकरी‚ छोटी‚ बेटी‚ कारटी‚ नग्निका‚

Python Demo

【讨论】:

    【解决方案2】:

    这是一个正则表达式替换语句:

    text = "test (n) trial, experiment, check run (v) race, rush speed (n) race, sprint, rush, dash, zoom"
    
    re.sub(r"(\w+ \(\w\))", r"\n\1", text)
    

    输出:

    '\ntest (n) trial, experiment, check \nrun (v) race, rush \nspeed (n) race, sprint, rush, dash, zoom'
    

    打印时提供:

    test (n) trial, experiment, check 
    run (v) race, rush 
    speed (n) race, sprint, rush, dash, zoom
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 2018-05-13
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      相关资源
      最近更新 更多