2

これは誰かにとって本当に素早い印になるでしょう...

これが私の文字列です:

Jan 13.BIGGS.04222 ABC DMP 15

私は一致するように探しています:

  1. 前の日付 (mmm yy) 形式
  2. 2 番目のフィールドの名前
  3. 末尾の数字。1 から 3 の間である可能性があります。

これが私がこれまでに持っているものです:

(\w{3} \d{2})\.(\w*)\..*(\d{1,3})$

http://www.pythonregex.com/をいじってみると、「5」には一致しますが、「15」には一致しません。

私は何を間違っていますか?

4

3 に答える 3

6

非貪欲.*?に一致するために使用します。.*

In [9]: re.search(r'(\w{3} \d{2})\.(\w*)\..*?(\d{1,3})$', text).groups()
Out[9]: ('Jan 13', 'BIGGS', '15')

疑問符がない場合は、.*一致させたい数字を含め、できるだけ多くの文字に一致し\d{1,3}ます。

于 2013-09-03T10:26:42.143 に答える
2

@unutbu が提案したものの代わりに、単語境界を使用することもできます。\bこれは「単語境界」に一致します。

(\w{3} \d{2})\.(\w*)\..*\b(\d{1,3})$

参考にしたサイトより:

>>> regex = re.compile("(\w{3} \d{2})\.(\w*)\..*\b(\d{1,3})$")
>>> regex.findall('Jan 13.BIGGS.04222 ABC DMP 15')
[(u'Jan 13', u'BIGGS', u'15')]
于 2013-09-03T10:32:10.723 に答える
1

.* before numbers are greedy and match as much as it can, leaveing least possible digits to the last block. You either need to make it non-greedy (with ? like unutbu said) or make it do not match digits, replacing . with \D

于 2013-09-03T10:29:34.563 に答える