捕捉复杂的名字

Wil*_*car 6 regex r

我的数据:

Caterina Guonçallvez braçeyro 
Francisco Ro[dr]í[gueJz luveyro
Johao de Miranda calçeteyro 
Lucas Martinz Mal-Cuzinhado, braçeyro 
Francisquo d[e] Arruda braçeyro 
Francisquo de Miranda braçeyro 
Run Code Online (Sandbox Code Playgroud)

- 名字姓氏
- 名字姓氏带有brakets和J(brakets ocr识别)
- 名字姓氏带连字符
- 名字姓氏带粒子
- 名字姓氏带粒子带刹车

预期产出

Caterina Guonçallvez
Francisco Ro[dr]í[gueJz
Johao de Miranda
Lucas Martinz Mal-Cuzinhado
Francisquo d[e] Arruda
Francisquo de Miranda
Run Code Online (Sandbox Code Playgroud)
  • 名字以大写字母开头

  • 名称的最后一部分后跟一个空格(或带空格的逗号)和一个以小写字母开头的单词,如"braçeyro"或"calçeteyro"(人们的工作)

    data < - readLines("clipboard",encoding ="latin1")

我尝试了什么:

^([a-zA-Zàáâäãå????èéêë??ìíîï??òóôöõøùúûü??ÿý??ñç?šžÀÁÂÄÃÅ?????ÈÉÊËÌÍÎÏ???ÒÓÔÖÕØÙÚÛÜ??ŸÝ??ÑßÇŒÆ?ŠŽ?ð])\w+[A-Z ,.'-]\w+
Run Code Online (Sandbox Code Playgroud)


Antonio Guomez
Caterina Guon
Francisco Ro
Johao de
Francisquo d

L3v*_*han 6

模式(([A-Z][\w\[\]-]+|de|d\[e\])\s?)+返回:

'Caterina Guonçallvez '
'Francisco Ro[dr]í[gueJz '
'Johao de Miranda '
'Lucas Martinz Mal-Cuzinhado'
'Francisquo d[e] Arruda '
'Francisquo de Miranda '
Run Code Online (Sandbox Code Playgroud)

这假设您正确设置了区域设置.

正则表达式匹配字母组(和连字符),以大写字母或"de"开头,后跟可选空格.这意味着您需要删除字符串以删除尾随空格.


编辑:证明它适用于R:

> Sys.setlocale("LC_ALL","en_us.UTF-8")
> library(stringr)
> x <- "Caterina Guonçallvez braçeyro "
> str_match(x, '(([A-Z][\\w\\[\\]-]+|de|d\\[e\\])\\s?)+')
     [,1]                    [,2]           [,3]         
[1,] "Caterina Guonçallvez " "Guonçallvez " "Guonçallvez"
Run Code Online (Sandbox Code Playgroud)