web-dev-qa-db-ja.com

製品コードはabcd2343のようになり、文字と数字で何を分割するか

テキストファイルに製品コードのリストがあります。それぞれに次のような製品コードがあります。

abcd2343 abw34324 abc3243-23A

つまり、文字の後に数字その他の文字が続きます。

分割数値の最初の出現にしたい。

30
Blankman
_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']
_
42
unutbu
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に行を置く必要があるでしょう

1
jwsample

最初の桁で分割するには

_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()を使用します。

1

それがうまくいくこのコードを試してください

import re
text = "MARIA APARECIDA 99223-2000 / 98450-8026"
parts = re.split(r' (?=\d)',text, 1)
print(parts)

出力:

['マリアアパレシダ'、 '99223-2000/98450-8026']

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