我正在尝试提取R中所有格式(国际和其他格式)的电话号码。
示例数据:
phonenum_txt <- "sDlkjazsdklzdjsdasz+49 123 999dszDLJhfadslkjhds0001 123.456sL:hdLKJDHS+31 (0) 8123zsKJHSDlkhzs&^#%Q(999)9999999adlfkhjsflj(999)999-9999sDLKO*$^9999999999adf;jhklslFjafhd9999999999999zdlfjx,hafdsifgsiaUDSahj"
我想要:
extract_vector
[1] "+49 123 999"
[2] 0001 123.456
[3] "+31 (0) 8123"
[4] (999)9999999
[5] (999)999-9999
[6] 9999999999
[7] 9999999999999
我尝试使用:
extract_vector <- str_extract_all(phonenum_txt,"^(?:\\+\\d{1,3}|0\\d{1,3}|00\\d{1,2})?(?:\\s?\\(\\d+\\))?(?:[-\\/\\s.]|\\d)+$")
我从HERE获得的,但是我的正则表达式技能不足以转换它以使其在R中工作。
谢谢!
答案 0 :(得分:2)
虽然您的数据似乎不现实,但是this expression可能会帮助您设计所需的表达式以匹配您的字符串。
(?=.+[0-9]{2,})([0-9+\.\-\(\)\s]+)
我添加了一个额外的边界,通常在输入复杂时可以添加边界。
如果愿意,可以添加或删除边界。例如,该表达式也可以工作:
([0-9+\.\-\(\)\s]+)
或者您可以为其添加其他左右边界,例如,如果所有电话号码都用小写/大写字母包裹:
[a-z]([0-9+\.\-\(\)\s]+)[a-z]
您可以简单地调用所需的目标输出,该目标输出使用$1
在捕获组中。
如果/当有真实数据可用时,正则表达式设计最有效。
答案 1 :(得分:1)
您可以使用此正则表达式匹配并提取字符串中包含的所有电话号码。
(?: *[-+().]? *\d){6,14}
此正则表达式的思想是允许在电话号码中的一位前允许该字符集[-+().]
中的一个字符(因为这些字符可以出现在您的电话号码中)。如果您的电话号码可以包含更多的字符,例如{
或}
或[
或]
,则可以将其添加到此字符集中。这个可选字符集可能被可选空格包围,因此我们在该字符集前后都有一个空格星号,最后我们有\d
用来将其与一个数字匹配,并且整个模式都被量化了{{1} }至少出现6次或最多出现14次(您可以根据需要配置这些数字),因为根据样本数据,电话号码中的最小数字为6(尽管实际上我认为是7或8)新加坡,但取决于您)
{6,14}
打印所有必需的数字,
library(stringr)
str_match_all("sDlkjazsdklzdjsdasz+49 123 999dszDLJhfadslkjhds0001 123.456sL:hdLKJDHS+31 (0) 8123zsKJHSDlkhzs&^#%Q(999)9999999adlfkhjsflj(999)999-9999sDLKO*$^9999999999adf;jhklslFjafhd9999999999999zdlfjx,hafdsifgsiaUDSahj", "(?: *[-+().]? *\\d){6,14}")