处理扫描目录中的原始文本数据
我只想保留两种类型的字符串:
- 以数字开头(艺术家作品)
- 包含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 |']
非常感谢任何帮助。
答案 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。