Вставить знаки ввода перед выделенным словом - PullRequest
0 голосов
/ 16 июня 2020

Мне нужно вставить разрывы строк (ввести знаки) между строкой перед началом каждого нового слова.

Строка:

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 + ((. *?)))


Обновить :

Ответ не относится к фактической строке, которую мне нужно обработать. По-разному ли строки Юникода обрабатываются регулярным выражением?

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

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Вы можете попробовать:

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

См. онлайн-демонстрацию


  • \s+ - пробельный символ, один или несколько раз . Чтобы предотвратить последующие пробелы в дальнейшем.
  • ( - Открытие 1-й группы захвата.
  • [^(\s]+ - Отрицательный класс символов: без открывающего парантеза или символа пробела, один или несколько раз.
  • \s+ - пробельный символ, один или несколько раз.
  • (?=\(.*?\)) - положительный просмотр вперед для буквального открывающего парантеза, любого символа, кроме символа новой строки, ноль или более раз (ленивый) и буквального закрытия paranthesis.
  • ) - Закрытие 1-й группы захвата.

В качестве альтернативы, возможно, попробуйте использовать модуль regex вместо re и попробуйте этот шаблон:

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

  • \s+( - один или несколько пробелов и открытие 1-й группы захвата. Это сделано для предотвращения конечных пробелов, когда мы добавим новые строки позже.
  • (?<=\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 Демо

1 голос
/ 16 июня 2020

Вот оператор замены регулярного выражения, который это делает:

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
...