使用gsub删除第一个_之前的字符

时间:2018-06-20 09:41:02

标签: r regex gsub

我正在使用

gsub(".*_","",ldf[[j]]),1,nchar(gsub(".*_","",ldf[[j]]))-4)

创建要写入的路径和文件名。对于lfd中只有一个下划线的名称,它可以正常工作。文件名后面紧跟着另一个下划线,它切断了第二个下划线前面的所有内容。

例如,我有: Arof_07122016_2.csv,我想要07122016,但得到2。但是我不知道为什么会这样。如何使用此行仅截断第一个下划线的fromt字符并保留第二个下划线的字符?

2 个答案:

答案 0 :(得分:2)

默认情况下,正则表达式重复是贪婪的,如?regex中所述:

  

默认情况下,重复是贪婪的,因此最大重复次数为   使用重复。可以通过添加?将其更改为“最小”。至   量词。 (还有更多的量词可以近似   匹配:请参阅TRE文档。)

因此,您应该使用模式".*?_"。但是,gsub将进行多个匹配,因此最终结果相同。为了解决这个问题,请使用sub,它只能使用正则表达式中的^来匹配1或在字符串的开头指定要匹配的内容。

sub(".*?_","","Arof_07122016_2.csv")
[1] "07122016_2.csv"
gsub("^.*?_","","Arof_07122016_2.csv")
[1] "07122016_2.csv"

答案 1 :(得分:2)

似乎想要

> ValueError                                Traceback (most recent call
> last) <ipython-input-9-c4eebc3bcdb0> in <module>()
>       1 
>       2 from gensim.models import Word2Vec
> ----> 3 model = gensim.models.KeyedVectors.load_word2vec_format('/home/slava/GoogleNews-vectors-negative300.bin.gz',
> binary=True)
> 
> /home/slava/anaconda2/lib/python2.7/site-packages/gensim/models/keyedvectors.pyc
> in load_word2vec_format(cls, fname, fvocab, binary, encoding,
> unicode_errors, limit, datatype)
>     205         with utils.smart_open(fname) as fin:
>     206             header = utils.to_unicode(fin.readline(), encoding=encoding)
> --> 207             vocab_size, vector_size = map(int, header.split())  # throws for invalid file format
>     208             if limit:
>     209                 vocab_size = min(vocab_size, limit)
> 
> ValueError: need more than 0 values to unpack

请参见regex demo

模式匹配

  • sub("^[^_]*_([^_]*).*", "\\1", ldf[[j]]) -字符串的开头
  • ^-除[^_]*以外的0多个字符
  • _-一个秘密的人
  • _-捕获组#1:([^_]*)以外的任何0+个字符
  • _-字符串的其余部分。

替换模式中的.*仅将捕获的值保留在结果中。

R demo

\1