テキストファイルに製品コードのリストがあります。それぞれに次のような製品コードがあります。
abcd2343 abw34324 abc3243-23A
つまり、文字の後に数字とその他の文字が続きます。
分割数値の最初の出現にしたい。
_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']
_
または、最初に出現する桁で分割する場合:
_In [43]: re.findall('\d*\D+',s)
Out[43]: ['abcd', '2343 abw', '34324 abc', '3243-', '23A']
_
\d+
_は、1桁以上の数字に一致します。\d*\D+
_は、0以上の数字とそれに続く1以上の非数字に一致します。\d+|\D+
_は、1つ以上の数字または1つ以上の非数字に一致します。Pythonの正規表現構文の詳細については the docs を参照してください。
re.split(pat, s)
は、s
を区切り文字として使用して、文字列pat
を分割します。 pat
が括弧で始まり(「キャプチャグループ」になるように)終わる場合、_re.split
_はpat
に一致する部分文字列も返します。たとえば、次を比較します。
_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
_
対照的に、re.findall(pat, s)
は、s
と一致するpat
の部分のみを返します。
_In [115]: re.findall('\d+', s)
Out[115]: ['2343', '34324', '3243', '23']
_
したがって、s
が数字で終わる場合は、re.findall('\d+|\D+', s)
の代わりに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']
_
import re
m = re.match(r"(?P<letters>[a-zA-Z]+)(?P<the_rest>.+)$",input)
m.group('letters')
m.group('the_rest')
これは、abc3243-23Aのコーナーケースをカバーし、文字グループにはabc
を、the_rest
には3243-23Aを出力します。
あなたはそれらがすべて個別の行にあると言ったので、あなたは明らかに一度にinput
に行を置く必要があるでしょう
最初の桁で分割するには
_parts = re.split('(\d.*)','abcd2343') # => ['abcd', '2343', '']
parts = re.split('(\d.*)','abc3243-23A') # => ['abc', '3243-23A', '']
_
したがって、2つの部分は常にparts [0]とparts [1]です。
もちろん、これを複数のコードに適用できます。
_>>> s = "abcd2343 abw34324 abc3243-23A"
>>> results = [re.split('(\d.*)', pcode) for pcode in s.split(' ')]
>>> results
[['abcd', '2343', ''], ['abw', '34324', ''], ['abc', '3243-23A', '']]
_
各コードが個別の行にある場合は、s.split( )
の代わりにs.splitlines()
を使用します。
それがうまくいくこのコードを試してください
import re
text = "MARIA APARECIDA 99223-2000 / 98450-8026"
parts = re.split(r' (?=\d)',text, 1)
print(parts)
出力:
['マリアアパレシダ'、 '99223-2000/98450-8026']
def firstIntIndex(string):
result = -1
for k in range(0, len(string)):
if (bool(re.match('\d', string[k]))):
result = k
break
return result