正则表达式在字符之前,在空格之后找到一个单词,但是如果','在空格之前找不到

时间:2011-11-04 17:06:36

标签: regex

好吧,我格式化ftp的帐号... 帐目安排如下:

bob, joe:######

但是,有些帐户名称后面有中间名/中间名,如下所示:

bob, joe r:######
bob, joe ryan:######

我已经尝试了[^,] *(:+)但是如果没有中间名/首字母,它会选择一个姓氏(它也会选择:)

我只需要获得中间名/首字母。谢谢!

3 个答案:

答案 0 :(得分:1)

您正在寻找一种消极的前瞻,这并非所有正则表达式语言都支持。在perl中,你的正则表达式看起来像这样:

/(?!,) (.*?)(:.+)/

perl -e 'print "$1 -- $2" if "bob, joe:######" =~ /(?!,) (.*?)(:.+)/;'
joe -- :######

perl -e 'print "$1 -- $2" if "bob, joe r:######" =~ /(?!,) (.*?)(:.+)/;'
joe r -- :######

答案 1 :(得分:0)

不确定我是否理解100%,但我猜你想在第二个例子中找到“r”和“ryan”。在那种情况下试试

[^:]*\s+(\w+):[^:]*

[^:] \ s +匹配之前的所有内容 :[^:] 匹配

之后的所有内容

一个问题是,如果没有中间不确定是否有问题,它会选择姓氏

注意到你不希望在这种情况下使用姓氏我修改它以要求姓氏,否则没有匹配:

[^:]*,\s+\w+\s+(\w+):[^:]*

答案 2 :(得分:0)

我不确定我明白你在问什么。如果你要求匹配中间名和initial,那么你可以在python中使用以下正则表达式:\w+\s+\w

在以下文件中:

tom, smith:######
bob, joe k:######
nick, ryan stevens:######

您将获得以下输出:

joe k
ryan s

编辑:由于某些名称中包含连字符,我将使用以下正则表达式:[a-zA-Z\-]+\s+\w