37
find = re.compile("^(.*)\..*")
for l in lines:
    m = re.match(find, l)
    print m.group(1) 

最初のドットまで、文字列内のすべてを正規表現したい。

入りa@b.cたいa@b
入りa@b.c.dたいa@b
入りたい 入りa@b.c.d.eたいa@b

私のコードが私に与えているもの...

  • a@b.c版画a@b
  • a@b.c.d版画a@b.c
  • a@b.c.d.e版画a@b.c.d

a@b のみを取得するには、何を見つける必要がありますか?

4

5 に答える 5

60

デフォルトでは、すべての量指定子は貪欲です。その意味で、彼らはできる限り多くの文字列を消費しようとします。それらの後にa を追加することで、それらを消極的にすることができ?ます:

find = re.compile(r"^(.*?)\..*")

コメントで述べたように、文字列にピリオドがない場合、このアプローチは失敗します。したがって、どのように動作させたいかによって異なります。しかし、その場合に完全な文字列を取得したい場合は、否定文字クラスを使用できます。

find = re.compile(r"^([^.]*).*")

最初のピリオドに遭遇した後、または文字列の最後で自動的に停止します。


また、 rematch()を使用したくありません。そこの。再。search()大丈夫なはずです。コードを次のように変更できます。

find = re.compile(r"^[^.]*")

for l in lines:
    print re.search(find, l).group(0)

ideone のデモ

于 2013-10-02T16:33:28.250 に答える
41

.find()この状況では、正規表現の代わりに使用できます。

>>> s = "a@b.c"
>>> print(s[0:s.find('.')])
a@b

コメントを考慮して、以下を使用していくつかの変更を行います( -1 の代わりに一致する文字列がない場合にエラーを返す点.index()を除いて、 と似ています)。.find()

>>> s = "a@b.c"
>>> try:
...     index = s.index('.')
... except ValueError:
...     index = len(s)
...
>>> print(s[:index])
a@b
于 2013-10-02T16:39:44.597 に答える
6

メソッドを使用できますsplit。文字列を文字で一度に分割する.と、(最初のピリオドの前、最初のピリオドの後)のタプルが得られます。表記は次のようになります。

mystring.split(".", 1)

_次に、関心のある部分を「生成」し、関心のない部分 (表記)を無視するジェネレータを簡単に作成できます。次のように機能します。

entries = [
    "a@b.c",
    "a@b.c.d",
    "a@b.c.d.e",
    ]

for token, _ in (entry.split(".", 1) for entry in entries):
    print token

出力:

a@b
a@b
a@b

メソッドのドキュメントは、オンラインsplitで見つけることができます。

str.split([sep[, maxsplit]])

sep区切り文字列として使用して、文字列内の単語のリストを返します。が指定されている場合maxsplit、最大で maxsplit分割が行われます (したがって、リストには最大で 個のmaxsplit+1 要素が含まれます)。が指定されていないか -1 の場合maxsplit、分割数に制限はありません (可能なすべての分割が行われます)。

于 2013-10-02T16:51:53.207 に答える