2010-07-27 9 views

Odpowiedz

26
In [32]: import re 

In [33]: s='abcd2343 abw34324 abc3243-23A' 

In [34]: re.split('(\d+)',s) 
Out[34]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A'] 

Albo, jeśli chcesz podzielić się na pierwszym wystąpieniu cyfry:

In [43]: re.findall('\d*\D+',s) 
Out[43]: ['abcd', '2343 abw', '34324 abc', '3243-', '23A'] 

  • \d+ mecze 1-lub-więcej cyfr.
  • \d*\D+ dopasowuje cyfry 0 lub więcej, a następnie 1 lub więcej cyfr innych niż cyfry.
  • \d+|\D+ mecze 1-lub-więcej cyfr lub 1-lub więcej-nie-cyfr.

Aby uzyskać więcej informacji na temat składni wyrażeń regularnych w języku Python, należy skonsultować się z the docs.


re.split(pat, s) będzie podzielić ciąg s korzystając pat jako ogranicznik. Jeśli pat zaczyna się i kończy nawiasami (aby być "grupą przechwytującą"), wówczas re.split zwróci również podciągi dopasowane przez pat. Na przykład, porównaj:

In [113]: re.split('\d+', s) 
Out[113]: ['abcd', ' abw', ' abc', '-', 'A'] # <-- just the non-matching parts 

In [114]: re.split('(\d+)', s) 
Out[114]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A'] # <-- both the non-matching parts and the captured groups 

Natomiast re.findall(pat, s) zwraca tylko te części s pasujących pat:

In [115]: re.findall('\d+', s) 
Out[115]: ['2343', '34324', '3243', '23'] 

Zatem, jeśli s kończy się cyfrą, można uniknąć kończąc na pusty ciąg za pomocą re.findall('\d+|\D+', s) zamiast re.split('(\d+)', s):

In [118]: s='abcd2343 abw34324 abc3243-23A 123' 

In [119]: re.split('(\d+)', s) 
Out[119]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123', ''] 

In [120]: re.findall('\d+|\D+', s) 
Out[120]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123'] 
+0

Jeśli użyjesz "(\ d +)", a cyfra będzie ostatnim znakiem ciągu, ostatni wpis na liście będzie pusty. Jak tego uniknąć? – user124384

+1

IIUC, możesz użyć 're.findall ('(\ d + | \ D +)', 'abcd2343 abw34324 abc3243-23')', które zwraca '['abcd', '2343', 'abw', '34324' , "abc", "3243", "-", "23"] ". – unutbu

0
def firstIntIndex(string): 
    result = -1 
    for k in range(0, len(string)): 
     if (bool(re.match('\d', string[k]))): 
      result = k 
      break 
    return result 
1
import re 

m = re.match(r"(?P<letters>[a-zA-Z]+)(?P<the_rest>.+)$",input) 

m.group('letters') 
m.group('the_rest') 

ta obejmuje sprawy narożnik abc3243-23A i wyjścia woli abc dla grupy liter i 3243-23A dla the_rest

Ponieważ stwierdzono, że są wszystkie na poszczególnych liniach będziesz oczywiście trzeba umieścić linia w czasie w input

1

Aby podzielić na pierwszej cyfry

parts = re.split('(\d.*)','abcd2343')  # => ['abcd', '2343', ''] 
parts = re.split('(\d.*)','abc3243-23A') # => ['abc', '3243-23A', ''] 

więc obie części są zawsze części [0] i części [1].

Oczywiście, można zastosować to do wielu kodów:

>>> s = "abcd2343 abw34324 abc3243-23A" 
>>> results = [re.split('(\d.*)', pcode) for pcode in s.split(' ')] 
>>> results 
[['abcd', '2343', ''], ['abw', '34324', ''], ['abc', '3243-23A', '']] 

Jeśli każdy kod jest w indywidualnej linii wtedy zamiast s.split() użytku s.splitlines().

Powiązane problemy