Я думаю, что это может быть полезно с помощью прогнозных или косвенных ссылок.Ссылка на Python - https://docs.python.org/3/library/re.html,, а один общий сайт регулярных выражений, на который я часто ссылаюсь, - https://www.regular -expressions.info / lookaround.html .
Ваши данные:
words = ["don't",
"'George",
"ma'am",
"end.'",
"didn't.'",
"'Won't",]
А теперь я определю кортеж с регулярными выражениями и их заменами.
In [230]: apo = (
(re.compile("(?<=[A-Za-z])'(?=[A-Za-z])"), "<apostrophe>",),
(re.compile("(?<![A-Za-z])'(?=[A-Za-z])"), "<opensingle>",),
(re.compile("(?<=[.A-Za-z])'(?![A-Za-z])"), "<closesingle>", ),
(re.compile("(?<=[A-Za-z])\\.(?![A-Za-z])"), "<period>",),
)
...: ...: ...: ...: ...: ...:
In [231]: words = ["don't",
"'George",
"ma'am",
"end.'",
"didn't.'",
"'Won't",]
...: ...: ...: ...: ...: ...:
In [232]: reduce(lambda w2,x: [ x[0].sub(x[1], w) for w in w2], apo, words)
Out[232]:
['don<apostrophe>t',
'<opensingle>George',
'ma<apostrophe>am',
'end<period><closesingle>',
'didn<apostrophe>t<period><closesingle>',
'<opensingle>Won<apostrophe>t']
Вот что происходит с регулярными выражениями:
(?<=[A-Za-z])
lookbehind , означающее только совпадение (но не потребляет ), если предыдущий символ представляет собой букву. (?=[A-Za-z])
является lookahead (по-прежнему не потреблять), если следующий символ представляет собой букву. (?<![A-Za-z])
- это негативный вид сзади , то есть, если перед ним стоит буква, она не будет совпадать. (?![A-Za-z])
является негативным прогнозом .
Обратите внимание, что я добавил .
чек в <closesingle>
, и порядок в apo
имеет значение,потому что вы можете заменить .
на <period>
...
Это работало с отдельными словами, но должно работать и с предложениями.
In [233]: onelong = """
don't
'George
ma'am
end.'
didn't.'
'Won't
"""
...: ...: ...: ...: ...: ...: ...:
In [235]: print(
reduce(lambda sentence,x: x[0].sub(x[1], sentence), apo, onelong)
)
...: ...:
don<apostrophe>t
<opensingle>George
ma<apostrophe>am
end<period><closesingle>
didn<apostrophe>t<period><closesingle>
<opensingle>Won<apostrophe>t
(Использование reduce
для облегчения применения регулярного выражения .sub
к словам / строкам и последующего сохранения этого вывода для следующего регулярного выражения .sub
и т. Д.)