12

如何提取以 $ 符号开头的字符串中的所有单词?例如在字符串中

This $string is an $example

我想提取单词$stringand $example

我尝试使用这个正则表达式\b[$]\S*,但只有当我使用普通字符而不是美元时它才能正常工作。

4

4 回答 4

23
>>> [word for word in mystring.split() if word.startswith('$')]
['$string', '$example']
于 2012-07-10T15:34:01.617 回答
9

您的 expr 的问题是\b空格和$. 如果删除它,一切正常:

z = 'This $string is an $example'
import re
print re.findall(r'[$]\S*', z) # ['$string', '$example']

为了避免匹配words$like$this,添加一个lookbehind断言:

z = 'This $string is an $example and this$not'
import re
print re.findall(r'(?<=\W)[$]\S*', z) # ['$string', '$example']
于 2012-07-10T15:34:15.183 回答
6

转义符在\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>
于 2012-07-10T15:31:24.167 回答
2

几种方法,具体取决于您想要定义为“单词”的内容以及是否全部用空格分隔:

>>> 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']
于 2012-07-10T15:34:47.427 回答