希望这篇文章更好......
所以我坚持这个程序的这个功能,它将返回指定某个关键字的整个单词。
ie - 如果我告诉它在字符串“blah blah blah blah I = 1mV blah blah等?”中查找单词“I =”,它会返回找到它的整个单词,所以在这种情况下,它会返回I = 1mV。
我尝试了很多不同的方法,例如,
text = "One of the values, I=1mV is used"
print(re.split('I=', text))
但是,这将返回相同的String而不包含I,因此它将返回
['One of the values, ', '1mV is used']
如果我尝试使用正则表达式解决方案,我会遇到数字可能超过1位数的问题,因此这个底部代码只有在数字为1位时才有效。如果I = 10mV是该值,它将只返回一个,但如果我有两次[/ 0-9],则代码不再仅使用1个值。
text = "One of the values, I=1mV is used"
print(re.findall("I=[/0-9]", text))
['I=1']
当我尝试使用re.match时,
text = "One of the values, I=1mV is used"
print(re.search("I=", text))
<_sre.SRE_Match object at 0x02408BF0>
检索单词的好方法是什么(在这种情况下,我想检索I = 1mV)并删除其余的字符串?
答案 0 :(得分:2)
更好的方法是首先将文本拆分为单词:
>>> text = "One of the values, I=1mV is used"
>>> words = text.split()
>>> words
['One', 'of', 'the', 'values,', 'I=1mV', 'is', 'used']
然后过滤单词以找到您需要的单词:
>>> [w for w in words if 'I=' in w]
['I=1mV']
这将返回其中包含I=
的所有单词的列表。然后我们可以找到第一个找到的元素:
>>> [w for w in words if 'I=' in w][0]
'I=1mV'
完成!我们可以做些什么来清理它只是寻找第一个匹配,而不是检查每个单词。我们可以使用生成器表达式:
>>> next(w for w in words if 'I=' in w)
'I=1mV'
当然,您可以调整if
条件以更好地满足您的需求,例如,您可以使用str.startswith()
检查单词是以某个字符串开头还是re.match()
来检查这个词与模式匹配。
答案 1 :(得分:2)
对于记录,您尝试使用I=
作为分隔符将字符串分成两半,几乎是正确的。您可以使用str.split()
来保留它,而不是使用放弃分隔符的str.partition()
。
>>> my_text = "Loadflow current was I=30.63kA"
>>> my_text.partition("I=")
('Loadflow current was ', 'I=', '30.63kA')
更灵活,更强大的解决方案是使用正则表达式:
>>> import re
>>> pattern = r"""
... I= # specific string "I="
... \s* # Possible whitespace
... -? # possible minus sign
... \s* # possible whitespace
... \d+ # at least one digit
... (\.\d+)? # possible decimal part
... """
>>> m = re.search(pattern, my_text, re.VERBOSE)
>>> m
<_sre.SRE_Match object at 0x044CCFA0>
>>> m.group()
'I=30.63'
这说明了更多的可能性(负数,整数或十进制数)。
请注意使用:
a*
- 零个或多个a
s a+
- 至少一个a
a?
- “可选” - 一个或零a
s re.VERBOSE
标志) - 比非详细等效词I=\s?-?\s?\d+(\.\d+)
更容易理解上面的模式。r"..."
而不是普通字符串"..."
- 表示不必转义文字反斜杠。这里不需要,因为我们的模式不使用反斜杠,但有一天你需要匹配C:\Program Files\...
,那一天你将需要原始字符串。练习1:你如何扩展它以便它也可以匹配单位?您如何扩展它以使其可以与mA
,A
或kA
匹配?提示:“轮换操作员”。
练习2:如何扩展它以便它可以匹配工程符号中的数字,即“1.00e3”或“-3.141e-4”?
答案 2 :(得分:1)
import re
text = "One of the values, I=1mV is used"
l = (re.split('I=', text))
print str(l[1]).split(' ') [0]
如果您有多个I=
,则对于每个奇数索引执行以上操作,其中0是第一个。
这是一个好方法,因为可以写“其中一个值,I = 1mV使用” 而且我想你想得到我是1mv。
BTW我是最新的,其单位是安培而不是伏特:)
答案 3 :(得分:1)
使用re.findall尝试,您需要添加一个+
,这意味着一个或多个
以下是一些例子:
import re
test = "This is a test with I=1mV, I=1.414mv, I=10mv and I=1.618mv."
result = re.findall(r'I=[\d\.]+m[vV]', test)
print(result)
test = "One of the values, I=1mV is used"
result = re.search(r'I=([\d\.]+m[vV])', test)
print(result.group(1))
第一张照片是:['I=1mV', 'I=1.414mv', 'I=10mv', 'I=1.618mv']
我在re.search示例中对I=
以外的所有内容进行了分组
所以第二个印刷品是:1mV
如果您有兴趣提取它。