在所选单词前插入输入标记

Insert enter marks before the selected word

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

字符串:

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; पाहा : पुत्र ‚ पुरुष 
मुलगी (स्त्री) पोर‚ पोरगी‚ पोरटी‚ बाला‚ बाळा‚ बालिका‚ छोकरी‚ छोटी‚ बेटी‚ कारटी‚ नग्निका‚

这是一个执行此操作的正则表达式替换语句:

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

re.sub(r"(\w+ \(\w\))", r"\n", 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

你可以试试:

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

Online Demo


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

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

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

  • \s+( - 一个或多个空格并打开第一个捕获组。这是为了防止我们稍后放置换行符时出现尾随空格。
  • (?<=\s+) - 空白字符的正后视(以防止开始字符串)。
  • [\p{Devanagari}\p{L}]+ - 字符 class 代表任何一种或多种梵文或来自任何语言的任何种类的字母。
  • (?=\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', test_str)

print(str_new)

打印:

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

Python Demo