У меня есть список имен, где фамилии и имена появляются вместе:

BorisovaSvetlana A.; KimHak Joong; PuXiaotao; LiuHung-wen*

Я хотел бы добавить запятую и пробел между фамилиями и именами, чтобы вывод был:

Borisova, Svetlana A.; Kim, Hak Joong; Pu, Xiaotao; Liu, Hung-wen*

Я использую нод String Manipulation в KNIME, и я думаю, что regexReplace($col1$, ,"") будет использоваться и, возможно, какой-то упреждающий взгляд, использующий [az] и [AZ] для поиска экземпляров строчной буквы непосредственно после заглавной буквы, но я Я новичок в регулярных выражениях, так что это все, что у меня есть.

Как мне решить эту проблему?

0
Zille 30 Апр 2019 в 23:39

3 ответа

Лучший ответ

Этот RegEx может помочь вам создать правильное выражение, соответствующее всем вашим входам:

([A-Z]{1}[a-z-]{1,})([A-Z]{1}[a-z-]{1,})
  • У него есть две группы захвата, одна для первого и другая для фамилий.
  • Он не соответствует латинским символам, при желании вы можете изменить a-z на \w.
  • Вы можете просто создать замену строки, чтобы заменить $1$2 на $1, $2.
  • Вы также можете добавить дополнительные границы к выражению, если это необходимо.

Это означает, что,

  • Одна заглавная буква, за которой следуют одна или несколько строчных букв и тире для первых имен, и то же самое для фамилий, и вы можете просто изменить эти границы внутри двух групп по своему усмотрению.

enter image description here


Редактировать:

Исходя из совета Pushpesh, его можно значительно упростить до это выражение:

([A-Z][a-z-]+)([A-Z][a-z-]+)

enter image description here

6
Emma 1 Май 2019 в 04:39

Синтаксис в KNIME в узле String Manipulation должен быть следующим:

regexReplace($col1$,"([A-Z][a-z-]+)([A-Z][a-z-]+)" ,"$1, $2")

Работал для меня с вашим примером. Regex может быть похожим, поскольку он работал со всеми 3 полученными / предложенными в повторах.

2
ipazin 2 Май 2019 в 08:57

Регулярное выражение, которое вам нужно

([a-z])([A-Z])

1-я группа захвата ([a-z]) Соответствует одному символу, присутствующему в списке ниже [a-z] a-z, одному символу в диапазоне между a (индекс 97) и z (индекс 122) (с учетом регистра)

2-я группа захвата ([A-Z]) Соответствует одному символу, представленному в списке ниже [A-Z] A-Z, одному символу в диапазоне между A (индекс 65) и Z (индекс 90) (с учетом регистра)

1
Ashok 30 Апр 2019 в 21:02