如何删除带有数字的单词而不删除字符串开头的数字?

时间:2014-04-24 17:46:41

标签: perl unix

我正在进行一些推文情绪分析,现在我正试图在Ubuntu命令行上使用perl来清理数据。 我有以下格式的一些数据:

sentiment, 'text'

sentiment = {0, 4}text is any valid string的位置。 目前我无法删除此类数据:

0,'My 21yo son has finally graduated from college!'
4,'The NT2000 is an awesome product!'
4,'what is good88guy doing on my following list?' 

我希望以下内容如下所示:

0,'My son has finally graduated from college!'
4,'The is an awesome product!'
4,'what is doing on my following list?' 

我不想删除情绪,我还需要删除yo。我有什么想法可以写这个脚本吗?

3 个答案:

答案 0 :(得分:0)

听起来你想要以下内容:

s/\w*\d\w*\s*//g;

您声明自己不希望从头开始删除""有点令人困惑,但你必须添加更多信息才能得到更好的答案。

传达你想要的最简单方法之一是创建一个前后字符串列表,试图让每个字符串都展示一个特例。

答案 1 :(得分:0)

你可能想试试这个:

s/ ?( |[a-z]+)\d+( |[a-z]+|)? ?/ /simg;

<强> 样本
http://regex101.com/r/zW2nJ3

答案 2 :(得分:0)

自从你最近的评论以来,我已经更好地理解了你的问题。

您描述的数据格式必须使用Text::CSV进行处理,以便考虑引用的字段和逗号分隔符。

根据我的理解,该程序应该符合您的需求。它有use autodie以避免在无法打开输入文件时手动编码异常的需要,并且Text::CSV从文件中读取数据,将单引号指定为字段分隔符。

我使用了原始答案中的代码来处理文件的每一行,因为如果您的需求需要改进,它可以提供最大的灵活性。

use strict;
use warnings;
use autodie;

use Text::CSV;

my $csv_proc = Text::CSV->new({ eol => $/, quote_char => "'" });

open my $fh, '<', 'myfile.txt';

while ( my $row = $csv_proc->getline($fh) ) {
  my @fields = split ' ', $row->[1];
  $row->[1] = join ' ', grep { not /\d/ } @fields;
  $csv_proc->print(*STDOUT, $row);
}

<强>输出

0,'My son has finally graduated from college!'
4,'The is an awesome product!'
4,'what is doing on my following list?'