grep заглавные слова в нижний регистр, исключая римские цифры
Я пытаюсь написать единственное регулярное выражение для преобразования всех прописных слов в строчные, исключая преобразование прописных римских цифр.
Единственным способом, который я нашел, было преобразование всех прописных слов, за которыми следуют пробел, запятая или точка, а также переносимых слов в строчные. Затем преобразуйте все римские цифры в верхний регистр.
Я использовал это для преобразования в нижний регистр:
(\u+[ ,.-])
Затем мне пришлось пройти и найти и заменить все подозрительные римские цифры.
Какой лучший способ сделать это? Я безуспешно пробовал негативные выражения, но я не очень силен в их написании.
Образец, на котором я тестирую это - Конституция США. Вот пример ввода:
МЫ, ЛЮДИ СОЕДИНЕННЫХ ШТАТОВ, чтобы сформировать более совершенный союз, установить справедливость, обеспечить внутреннее спокойствие, обеспечить общую оборону, содействовать общему благосостоянию и обеспечить благословения свободы для нас самих и нашего потомства, предопределяем и установить эту Конституцию для Соединенных Штатов Америки.
СТАТЬЯ I.
Секта. 1. ВСЕ законодательные полномочия, предоставленные в настоящем документе, принадлежат Конгрессу Соединенных Штатов, который состоит из Сената и Палаты представителей.
Секта. 2. Палата представителей состоит из членов, избираемых раз в два года всеми народами нескольких штатов, и выборщики в каждом штате должны обладать квалификационными требованиями, необходимыми для выборщиков наиболее многочисленной ветви законодательного собрания штата. Никто не может быть Представителем, который не достиг бы возраста двадцати пяти лет и не был гражданином Соединенных Штатов Америки в течение семи лет, и который при избрании не должен быть жителем того государства, в котором он должен быть. выбран.
СТАТЬЯ IV.
СТАТЬЯ V.
СТАТЬЯ VI
1 ответ
Если регулярное выражение поддерживает отрицательные взгляды, вы можете попробовать:
\b(?![LXIVCDM]+\b)([A-Z]+)\b
в котором говорится "любые слова верхнего регистра, которые не полностью состоят из L, X, I, V, C, D, M" (римские цифры).
Это также удобно останавливает преобразование слова "я". (Кроме того, если вы хотите предотвратить преобразование однобуквенных заглавных слов, используйте [A-Z]{2,}
- это предотвратит преобразование заглавной буквы "А" (в начале предложения) и меня, что обычно требуется в их обычном случае).
Это остановило бы слова, состоящие полностью из этих букв, которые сопоставляются - единственные, о которых я могу думать, это "DID" и, возможно, "DIV" (как в HTML), "DIM" (как в измерении), "MID", "MIDI", "VIC" (как в Виктории?)...
Хотя вы, конечно, можете изменить регулярное выражение римских чисел, чтобы оно было немного более внимательным к правилам, например,
(?=[MDCLXVI])M{0,3}(C[DM]|DC{0,3}|C{1,3})?(X[LC]|LX{0,3}|X{1,3})?(I[XV]|VI{0,3}|I{1,3})?
Объяснение:
(?=[MDCLXVI]) # make sure we match at least something
# (since everything in this regex is optional)
M{0,3} # Can have 0 to 3 Ms, being thousands
(C[DM]|DC{0,3}|C{1,3})? # for the hundreds column can have CD, CM,
# C, CC, CCC, D, DC, DCC, DCCC
(X[LC]|LX{0,3}|X{1,3})? # for the tens column can have XL, XC,
# L, LX, LXX, LXXX, X, XX, XXX
(I[XV]|VI{0,3}|I{1,3})? # for the ones column can have IX, IV,
# V, VI, VII, VIII, I, II, III.
Я думаю, что охватывает все возможные римские цифры....
Если ваш вкус регулярных выражений не поддерживает негативные взгляды, возможно, вы могли бы сделать что-то вроде:
\b((ROMAN_NUMERAL_REGEX)|([A-Z]+))\b
И заменить на "$2$3_converted_to_lower_case" (извините - я не знаю, как сделать само преобразование).
Вышеприведенное сработает, потому что регулярное выражение всегда соответствует либо регулярному выражению римской цифры (и записывается в $2), либо другому регулярному выражению (захватывается в $3). Таким образом, один из $ 2 или $ 3 всегда пуст.