Eu tenho um .docx
arquivo que contém mcqs que estão no formato como mostrado abaixo. O problema é que existem muitos mcqs duplicados e, portanto, gostaria de saber se um regex pode ser criado para detectar todos os mcqs duplicados.
Tenho Edit Pad Pro 7, Notepad ++, powergrep e texto sublime. e todo o regex que eu usei até agora excluiu duplicatas linha por linha, excluindo opções de outras perguntas, mesmo que as perguntas não correspondam.
Então, basicamente, o que estou dizendo é que preciso de um regex que possa excluir todos os mcqs duplicados apenas se o mcq inteiro corresponder, não linhas ou frases individuais.
Como sou novato em relação à regex, desculpe-me por qualquer inadequação.
Lichen planus occurs most frequently on the?
A. buccal mucosa.
B. tongue.
C. floor of the mouth.
D. gingiva.
In the absence of “Hanks balanced salt solution”, what is the most appropriate media to transport an avulsed tooth?
A. Saliva.
B. Milk.
C. Saline.
D. Tap water.
Which of the following is the most likely cause of osteoporosis, glaucoma, hypertension and peptic ulcers in a 65 year old with Crohn’s disease?
A. Uncontrolled diabetes.
B. Systemic corticosteroid therapy.
C. Chronic renal failure.
D. Prolonged NSAID therapy.
E. Malabsorption syndrome.
Lichen planus occurs most frequently on the?
A. buccal mucosa.
B. tongue.
C. floor of the mouth.
D. gingiva.
resultado esperado
Lichen planus occurs most frequently on the?
A. buccal mucosa.
B. tongue.
C. floor of the mouth.
D. gingiva.
In the absence of “Hanks balanced salt solution”, what is the most appropriate media to transport an avulsed?
A. Saliva.
B. Milk.
C. Saline.
D. Tap water.
Which of the following is the most likely cause of osteoporosis, glaucoma, hypertension and peptic ulcers in a 65 year old with Crohn’s disease?
A. Uncontrolled diabetes.
B. Systemic corticosteroid therapy.
C. Chronic renal failure.
D. Prolonged NSAID therapy.
E. Malabsorption syndrome.
notepad++
regex
sublime-text-3
covil
fonte
fonte
Respostas:
(([^?]+\?\R(?:.+\.\R)+)[\s\S]+?)\2
$1
. matches newline
Explicação:
Substituição:
fonte
v7.5.6
.Tecnicamente, na entrada fornecida, não há duplicatas como 'A. mucosa bucal. e 'A. mucosa bucal. diferem no número de espaços após 'A.'.
No entanto, a intuição sugere que esses casos devem ser detectados de alguma forma.
Como você mencionou no comentário que está usando https://regex101.com/ , usarei esta página da web para fazer as correspondências e substituições.
Selecionei flavor: javascript e defina dois sinalizadores na seção de expressões regulares: g (global) es (linha única).
Vou usar 3 padrões para lidar com essa string.
O primeiro padrão procura por ocorrências idênticas de question_and_answer. Se houver discrepâncias entre eles, eles não serão tratados como duplicados.
Se houver mais de uma duplicata, todas elas serão capturadas.
(?<=^|\n)([^\n]+)(\n)(\D{1}\.\s+[^^]+?)(\n{2})(?=[^^]*\1\n\3)
Entrada (TEST STRING):
Saída (SUBSTITUIÇÃO): // uma duplicata removida
Se apenas queremos encontrar duplicatas com base nas perguntas, esse padrão deve funcionar, mas deve ser usado apenas para fins informativos.
(?<=^|\n)([^\n]+)(\n)(\D{1}\.\s+[^^]+?)(\n{2})(?=[^^]*\1)
Entrada (TEST STRING):
Saída (SUBSTITUIÇÃO): // parece ok, mas é um truque e deve ser usado com cuidado
Idealmente, se soubermos que tipo de desvios podemos encontrar nos dados, podemos limpá-los antes que o primeiro padrão seja aplicado, como no exemplo a seguir, onde vários espaços são substituídos por apenas um espaço.
Localizar:
(?<=\n)(\D{1}\.)(\s+)([^^]+?\n)
Substituição:
\1 \3
Entrada (TEST STRING):
Saída (SUBSTITUIÇÃO):
fonte
[^^]*
?\n
na caixa de texto substituir: (1)(^[^\e]+?$)(\R)(\D{1}\.\s+[^\e]+?)(\R{2})(?=[^\e]*\1\2\3)
; (2)(^[^\e]+?)(\R)(\R)(?=[^^]*\1(\R|$))
. Ainda haverá muitas novas linhas, mas os dados em si serão bem estruturados e fáceis de trabalhar para humanos e máquinas.[^^]*
e[^\e]*
?^
'início de linha', então eu frequentemente o uso para capturas gananciosas.[^^]*
significa 0 ou o máximo de caracteres possível.^
dentro de uma classe de caractere não significa "início de linha", mas nega a classe de caractere quando na primeira posição, significa simplesmente um sinal de intercalação^
, portanto[^^]*
não significa um sinal de intercalação 0 ou mais vezes.