使用SAS的Perl正则表达式 - 精确匹配其中之一。

3

我需要提取文本中以文字或数字表示的数字。

我有一个看起来像这样的表格:

... 1 child ...
... three children ... 
...four children ...    
...2 children...
...five children

我希望捕获以文字或数字形式书写的数字。每行只有一个数字。所需输出应为:

1
three
four
2
five

我的正则表达式看起来像这样:

prxparse("/one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|child|\d\d?/")

有需要帮助的地方吗?

“我想精确匹配一个、两个、2或四个”是什么意思?你只想匹配字符串“one”、“two”、“2”和“four”吗? - matt freake
我想捕获以文字或数字形式书写的数字。每行只有一个数字。 - DJJ
1个回答

6

描述

这个正则表达式将匹配包含在空格或符号中的数字。

(?<=\s|^)(?:[0-9]+|one|two|three|four|five|six|seven|eight|nine|ten)(?=\s|$)

enter image description here

实时示例: http://www.rubular.com/r/6ua7fTb8IS

如果要包括除一至十以外的数字的全拼单词版本,需要加入以下内容。此正则表达式将捕获从零到一百的数字 [除了任何错别字]。

(?<=\s|^)(?:[0-9]+|(?:(?:twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety)\s)?(?:one(?:[\s-]hundred)?|two|three|four|five|six|seven|eight|nine)|ten|eleven|twelve|(?:thir|four|fif|six|seven|eight|nine)teen|twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|zero)(?=\s|$)

enter image description here

实时示例: http://www.rubular.com/r/EIa18nx731

Perl示例

 $string = <<END;
 ... 1 child ...
 ... three children ... 
 ... four children ...    
 ... 2 children...
 ... five children
END
@matches = $string =~ m/(?<=\s|^)[0-9]+|one|two|three|four|five|six|seven|eight|nine|ten(?=\s|$)/gi;
    print join("\n", @matches);

产量

1
three
four
2
five

你用什么程序制作这些图形的啊!?太厉害了。 - Robert Penridge
2
@ Rob Penridge。谢谢 :) 我正在使用debuggex.com。虽然它不支持向后查找或原子组,但仍然很方便理解表达式流程。还有regexper.com。他们也做得很好,但它不是实时的,因为你在输入时。 - Ro Yo Mi
1
另外,我相信“ninety”的拼写应该是带有“e”的。你好像漏掉了它。http://www.thefreedictionary.com/ninety - Robert Penridge
抱歉回复晚了,我其实在应对很多其他挑战。非常感谢你的提示。但是在SAS中正则表达式似乎无法工作,或者可能是我也不知道如何实现。你手头有任何有关Perl正则表达式的教程吗?谢谢。 - DJJ
我认为你正在寻找Perl,如果是这样,请查看http://www.regular-expressions.info/tutorial.html,http://perldoc.perl.org/perlre.html或http://support.sas.com/rnd/base/datastep/perl_regexp/regexp-tip-sheet.pdf。我还更新了答案中的表达式,使其更符合跨平台的规范。 - Ro Yo Mi

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