在所选单词前插入输入标记
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+(?=\(.*?\)))
\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; पाहा : पुत्र ‚ पुरुष
मुलगी (स्त्री) पोर‚ पोरगी‚ पोरटी‚ बाला‚ बाळा‚ बालिका‚ छोकरी‚ छोटी‚ बेटी‚ कारटी‚ नग्निका‚
我需要在每个新单词开始之前在字符串之间插入换行符(输入标记)。
字符串:
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+(?=\(.*?\)))
\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; पाहा : पुत्र ‚ पुरुष
मुलगी (स्त्री) पोर‚ पोरगी‚ पोरटी‚ बाला‚ बाळा‚ बालिका‚ छोकरी‚ छोटी‚ बेटी‚ कारटी‚ नग्निका‚