在正则表达式中苦苦挣扎,从字符串中删除数字

时间:2014-09-24 01:00:00

标签: php regex

我有很多字符串,如:

Virtus.pro (13)

mousesports (16)

Natus Vincere (12)

正如您所看到的那样,在所有情况下,将名称与数字分开并不常见。 我是Regex的新手。有没有人有任何想法如何拆分这些字符串以包含2个变量?

Virtus.pro13。那么mousesports16

正如您所看到的,Natus Vincere在名称的两个部分之间有一个空格。

真的很挣扎,我只能提出一个正则表达式来提取数字。但这并不是每次都有效。

3 个答案:

答案 0 :(得分:4)

我认为你正在寻找类似的东西:

$data = [
    "Virtus.pro (13)",
    "mousesports (16)",
    "Natus Vincere (12)"
];

foreach ($data as $string) {
    $matches = [];
    preg_match('/(.*)\s\((\d+)\)/', $string, $matches);
    list(, $team, $score) = $matches;
    var_dump($team, $score);
}

输出:

string(10) "Virtus.pro"
string(2) "13"
string(11) "mousesports"
string(2) "16"
string(13) "Natus Vincere"
string(2) "12"

我们的想法是寻找一个子串,后跟一个空格,左括号,一些数字和一个右括号。领先的子字符串和数字在捕获组中被捕获,然后吐出到$team$score

答案 1 :(得分:1)

r'([a-zA-Z. ]+) (\(\d{1,2}\))'

我在python中试过这个,它对我有用。 你最好提供我认为的更多细节,例如,名称的格式,它包含哪种标点符号,数字,它有多少位数等等。

在我上面的回答中,名称字符串可以包含'。'和'',数字将是1或2位数。 你可以把它改成

r'([a-zA-Z. ]+) \((\d+)\)'

匹配一个您不知道它包含多少位数的数字。 它按顺序对匹配结果进行分组,第二组(索引1)是名称,第三组(索引2)是数字。

>>> import re
>>> are=re.compile(r'([a-zA-Z. ]+) \((\d{1,2})\)')
>>> d=are.search('Virtus.pro (13)')
>>> d.group()
'Virtus.pro (13)'
>>> d.group(1)
'Virtus.pro'
>>> d.group(2)
'13'
希望它有所帮助。

答案 2 :(得分:0)

嗨,你可以使用这样的东西

    #!/usr/bin/env python

    import re
    regex = re.compile('^(.*)\((\d+)\)$')
    my_match = regex.match('Virtus.pro (13)')

然后你可以这样做:

    m.group(1) #to get 'Virtus.pro '

    m.group(2) #to get '13'

这是在python btw

中实现的