$記号で始まる文字列内のすべての単語を抽出するにはどうすればよいですか?たとえば、文字列で
This $string is an $example
$string
単語とを抽出したい$example
。
この正規表現を試してみまし\b[$]\S*
たが、ドルではなく通常の文字を使用した場合にのみ正常に機能します。
$記号で始まる文字列内のすべての単語を抽出するにはどうすればよいですか?たとえば、文字列で
This $string is an $example
$string
単語とを抽出したい$example
。
この正規表現を試してみまし\b[$]\S*
たが、ドルではなく通常の文字を使用した場合にのみ正常に機能します。
>>> [word for word in mystring.split() if word.startswith('$')]
['$string', '$example']
exprの問題は\b
、スペースと。が一致しないこと$
です。削除すると、すべてが機能します。
z = 'This $string is an $example'
import re
print re.findall(r'[$]\S*', z) # ['$string', '$example']
一致を回避するwords$like$this
には、後読みアサーションを追加します。
z = 'This $string is an $example and this$not'
import re
print re.findall(r'(?<=\W)[$]\S*', z) # ['$string', '$example']
エスケープは単語の境界で一致します\b
が、$記号は一致できる単語の一部とは見なされません。代わりに、開始またはスペースで一致します。
re.compile(r'(?:^|\s)(\$\w+)')
ここでは、文字クラスの代わりにドルのバックスラッシュエスケープを使用しました。また\w+
、意図をより適切に反映するために、1文字以上の文字クラスという単語を使用しました。
デモ:
>>> import re
>>> dollaredwords = re.compile(r'(?:^|\s)(\$\w+)')
>>> dollaredwords.search('Here is an $example for you!')
<_sre.SRE_Match object at 0x100882a80>
「単語」として定義したいものに応じて、またすべてがスペースで区切られている場合は、いくつかのアプローチがあります。
>>> s='This $string is an $example $second$example'
>>> re.findall(r'(?<=\s)\$\w+',s)
['$string', '$example', '$second']
>>> re.findall(r'(?<=\s)\$\S+',s)
['$string', '$example', '$second$example']
>>> re.findall(r'\$\w+',s)
['$string', '$example', '$second', '$example']
行の先頭に「単語」がある場合:
>>> re.findall(r'(?:^|\s)(\$\w+)','$string is an $example $second$example')
['$string', '$example', '$second']