从向量中删除字符串

4

从扫描的目录中处理原始文本数据。

我只想保留两种类型的字符串:

  • 以数字开始(艺术家的作品)
  • 包含2个相邻的带有重音的大写字母(艺术家的姓名)

我希望轻松删除其他所有内容(用真-假?)

我的数据

ÁÀ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.

预期结果
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.

数据可以使用以下方式导入到 R 中:
readlines ("clipboard")

我能够使用正则表达式识别包含大写字母的艺术家名称。

例如:

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

我能够识别包含艺术品的线条。
^[0-9]+[\s]

非常感谢您的任何帮助。

3个回答

4

顺便提一下:[:upper:]匹配当前语言环境下的大写字母(参见源代码)。所以,如果您只使用一个区域设置,则此解决方案是不错的选择:

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演示

正则表达式细节:

  • ^ - 字符串开始
  • [[:digit:]]+ - 一个或多个数字
  • [[:blank:]] - 一个空格或制表符
  • | - 或
  • [[:upper:]]['[:upper:]] - 大写字母后跟'或另一个大写字母。

以下是使用类Perl正则表达式实现所需结果的方法:

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

该正则表达式匹配:

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

示例演示的输出:

[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)

正则表达式^[\\P{L}\\D]*?([\\p{L}\\d])匹配在字母或数字之前尽可能少的任何非字母和非数字(这些字符被放入一个捕获组中),然后使用\1反向引用在gsub调用中恢复捕获的字母数字。在grep之前使用它。

请参见IDEONE演示


好的!最后一点,有些名称在第二个位置有一个撇号(')。如何将其添加到正则表达式中? - Wilcar
我认为你需要使用 ll[grep("^\\d+\\s|\\p{Lu}['\\p{Lu}]", ll, perl=T)] - Wiktor Stribiżew
好的!最后一个要点。我尝试清理我的文本,以确保数字和字母从行首开始(删除空格和任何非字母数字字符)。 - Wilcar
然后 gsub("^\\W+", "", ll) - Wiktor Stribiżew
好的,但是W+不能处理带有重音符号的字符。我可以使用ICU吗? - Wilcar
你可以使用类似 Perl 的替换方式 gsub("^[\\P{L}\\D]*?([\\p{L}\\d])", "\\1", ll, perl=T)。在 grepping 之前添加它。 - Wiktor Stribiżew

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."  

我想要分别处理字母和数字。你的回答帮助我理解我必须考虑“字母数字混合体”。 只是一个注释:我的名称有带重音的大写字母。我改变了我的问题。 - Wilcar
[:upper:] 可以用于带重音符号的字符 - 我认为这段代码在你的新编辑中仍然有效? - jeremycg
好的!但是我希望删除的行有时以大写字母开头,因为艺术家的名字全部用大写字母书写。 - Wilcar
请查看编辑 - 现在的条件是开头必须至少有2个大写字母({2,})。 - jeremycg

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)]

您可以查看编译后的演示,了解如何使用这两个正则表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接