从向量中删除字符串

时间:2015-11-22 20:29:41

标签: regex r

处理扫描目录中的原始文本数据  我只想保留两种类型的字符串:
- 以数字开头(艺术家作品)
- 包含2个并列的大写字母**和重音**(艺术家姓名)

我想轻松删除其他所有内容(使用true -false?)

我的数据

function NullifyAndSetValue()
{
    msrmnt1.msrmntValue.dispose();
    msrmnt1 = null;

    msrmnt2.msrmntValue.dispose();
    msrmnt2 = null;

    line.convertFactor(80);
}

预期结果

ÁÀDFDS (artist 1 with accents)
1 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
AB (artist 2)
2 Nulla sollicitudin elit in purus egestas, in placerat velit iaculis.
B'BDDED (artist 3)
az*ù*ù*ù (bad string)
3 Nunc et eros eget turpis sollicitudin mollis id et mi.
4 Mauris condimentum velit eu consequat feugiat.
5 Suspendisse sit amet metus vitae est eleifend tincidunt.
ÉÈDFSF (artist 4)
6 Sed cursus augue in tempus scelerisque.
A..gdgdgdg (bad string begining with a upper case letter)
7 in commodo enim in laoreet gravida.

将数据导入R:

with accents DFDS
1 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
AB 
2 Nulla sollicitudin elit in purus egestas, in placerat velit iaculis.
B'BDDED
3 Nunc et eros eget turpis sollicitudin mollis id et mi.
4 Mauris condimentum velit eu consequat feugiat.
5 Suspendisse sit amet metus vitae est eleifend tincidunt.
ÉÈDDFSF
6 Sed cursus augue in tempus scelerisque.
7 in commodo enim in laoreet gravida.

我能够识别包含不同正则表达式的大写字母的艺术家姓名的行

e.g。

readlines ("clipboard")

我能识别包括艺术品在内的一行

[A-ZÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝYÆO][A-ZÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝYÆO |']

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

只是旁注:[:upper:]匹配当前区域设置中的大写字母 see source)。因此,如果您使用一个区域设置,此解决方案很好:

ll <- readLines(textConnection("ÁÀDFDS (artist 1)
1 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
AB (artist 2)
2 Nulla sollicitudin elit in purus egestas, in placerat velit iaculis.
BBDDED (artist 3)
az*ù*ù*ù (bad string)
3 Nunc et eros eget turpis sollicitudin mollis id et mi.
4 Mauris condimentum velit eu consequat feugiat.
5 Suspendisse sit amet metus vitae est eleifend tincidunt.
ÉÈDFSF (artist 4)
6 Sed cursus augue in tempus scelerisque.
...gdgdgdg (bad string)
7 in commodo enim in laoreet gravida."))
ll[grep("^[[:digit:]]+[[:blank:]]|[[:upper:]]['[:upper:]]", ll)]

请参阅IDEONE demo

正则表达式分解:

  • ^ - 字符串开头
  • [[:digit:]]+ - 一位或多位
  • [[:blank:]] - 1个空格或标签
  • | - 或
  • [[:upper:]]['[:upper:]] - 大写字母后跟'或其他大写字母。

这是一种通过类似Perl的正则表达式实现所需的方法:

ll[grep("^\\d+\\s|\\p{Lu}['\\p{Lu}]", ll, perl=T)]

正则表达式匹配:

  • ^ - 字符串开头
  • \\d+\\s - 一个或多个数字,然后是一个空格
  • | - 或......
  • \\p{Lu}['\\p{Lu}] - 一个大写的Unicode字母后跟一个撇号或另一个大写的Unicode字母。

sample demo的输出:

[1] "ÁÀDFDS (artist 1)"                                                     
[2] "1 Lorem ipsum dolor sit amet, consectetur adipiscing elit."            
[3] "AB (artist 2)"                                                         
[4] "2 Nulla sollicitudin elit in purus egestas, in placerat velit iaculis."
[5] "BBDDED (artist 3)"                                                     
[6] "3 Nunc et eros eget turpis sollicitudin mollis id et mi."              
[7] "4 Mauris condimentum velit eu consequat feugiat."                      
[8] "5 Suspendisse sit amet metus vitae est eleifend tincidunt."            
[9] "ÉÈDFSF (artist 4)"                                                     
[10] "6 Sed cursus augue in tempus scelerisque."                             
[11] "7 in commodo enim in laoreet gravida."    

要清理字符串的开头,可以使用

ll <- gsub("^[\\P{L}\\D]*?([\\p{L}\\d])", "\\1", ll, perl=T)

regex ^[\\P{L}\\D]*?([\\p{L}\\d])在字母或数字(放入捕获组)之前尽可能少地匹配任何非字母和非数字,然后使用{{1}恢复捕获的字母数字使用\1调用进行反向引用。在gsub ping之前使用它。

请参阅IDEONE demo

答案 1 :(得分:1)

您可以使用grep

z<-readlines ("clipboard")
z[grep("^[0-9]|[[:upper:]]{2,}", z)]
 [1] "AADFDS (artist 1)"                                                     
 [2] "1 Lorem ipsum dolor sit amet, consectetur adipiscing elit."            
 [3] "AB (artist 2)"                                                         
 [4] "2 Nulla sollicitudin elit in purus egestas, in placerat velit iaculis."
 [5] "BBDDED (artist 3)"                                                     
 [6] "3 Nunc et eros eget turpis sollicitudin mollis id et mi."              
 [7] "4 Mauris condimentum velit eu consequat feugiat."                      
 [8] "5 Suspendisse sit amet metus vitae est eleifend tincidunt."            
 [9] "CCDDFSF (artist 4)"                                                    
[10] "6 Sed cursus augue in tempus scelerisque."                             
[11] "7 in commodo enim in laoreet gravida."  

答案 2 :(得分:1)

如果需要,可以使用POSIX字符类。但是,它们的解释取决于当前的语言环境,如果设置不正确,它可能会改变POSIX类的行为。

我建议打开Perl正则表达式并使用Unicode属性。

x <- readLines('clipboard')
r <- x[grepl("^\\pN+|\\p{Lu}[\\p{Lu}']", x, perl=TRUE)]

另一个有趣的方法是匹配重音字母,劝阻POSIX。

r <- x[grepl("^\\d+|(?![×Þß÷þø])[A-ZÀ-ÿ][A-ZÀ-ÿ']", x, perl=TRUE)]

您可以查看正在使用的两个正则表达式的已编译demo