在Python中查找以$sign开头的字符串中的所有单词

在Python中查找以$sign开头的字符串中的所有单词,python,regex,dollar-sign,Python,Regex,Dollar Sign,如何提取以$符号开头的字符串中的所有单词?例如在字符串中 This $string is an $example 我想提取单词$string和$example 我尝试使用这个正则表达式\b[$]\S*,但只有在使用普通字符而不是美元时,它才能正常工作。转义符在单词边界处匹配,但美元符号不被认为是您可以匹配的单词的一部分。改为在起始位置或空格处匹配: re.compile(r'(?:^|\s)(\$\w+)') 我在这里对美元使用了反斜杠转义,而不是字符类,并且\w+word字符类至少包含1个

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

This $string is an $example
我想提取单词
$string
$example


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

转义符在单词边界处匹配,但美元符号不被认为是您可以匹配的单词的一部分。改为在起始位置或空格处匹配:

re.compile(r'(?:^|\s)(\$\w+)')
我在这里对美元使用了反斜杠转义,而不是字符类,并且
\w+
word字符类至少包含1个字符,以更好地反映您的意图

演示:

>>重新导入
>>>dollaredwords=re.compile(r'(?:^\s)(\$\w+))
>>>search('这里有一个$示例!')

表达式的问题是
\b
空格和
$
之间不匹配。如果您将其删除,则一切正常:

z = 'This $string is an $example'
import re
print re.findall(r'[$]\S*', z) # ['$string', '$example']
要避免匹配
单词$this
,请添加查找断言:

z = 'This $string is an $example and this$not'
import re
print re.findall(r'(?<=\W)[$]\S*', z) # ['$string', '$example']
z='此$string是一个$示例,而此$not'
进口稀土

打印关于findall(r’(?几种方法,取决于您想要定义为“单词”的内容,如果所有方法都用空格表示:

>>> 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']

如果您正在搜索单词(并且不希望包含逗号/点/分号/引号),则
\w
优于
\S
。为什么要提取这些单词?这看起来很像某种字符串替换语言,在这种情况下,您真的应该使用它,因为它已经为您实现,并且已经完全支持这种语法。请使用
word.startswith(“$”)
。它更具可读性(并且可以处理空单词)。这实际上是到目前为止更好的解决方案。@user1515248-是的,我喜欢尽可能避免使用正则表达式;)天哪,这太简单了。我一直在寻找提取URL的解决方案,我的字符串并没有太混乱,这是可行的。现在我需要寻找如何处理结尾处的标点符号,我已经设置好了。@thg435:非常正确,也发现了这一点:-P更正了它以解决真正的问题。只需添加括号
(?:^\s)(\$\w+)
您将不会在匹配中添加空格。干杯!@drewk:是的;但我仍然认为非正则表达式的解决方案在这里更好。不过它也会匹配
$$words
,不是吗?@Martijn,是的,这一个有几个问题。无论如何,非正则表达式的解决方案在这种情况下更好。这在字符串的一开始就不匹配。我会使用反向查找:
(?。这将使
word$与$embedded$匹配
。它不会匹配字符串中的第一个单词,例如,“$first other words'@MartijnPieters:我确实符合以下条件:“由空格划定”,并添加了一个匹配组,该组也处理行首的单词…这与我的解决方案相同,但存在相同的问题:前面的空格现在是匹配字符串的一部分。:-)
z = 'This $string is an $example and this$not'
import re
print re.findall(r'(?<=\W)[$]\S*', z) # ['$string', '$example']
>>> 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']