[英]Regular expression to match word followed by a pair of brackets
我有一个字符串是:
str2s = 'orange,juices,apple,apple[-2]'
我正在尝试使用正则表达式而不是使用 str.split() 来提取括号内的所有这些词,所以我想要:
'orange', 'juices', 'apple', 'apple[-2]'
我尝试使用:
re.findall(
'[A-Za-z][A-Za-z0-9_%\\.]{0,}\[?[a-zA-Z0-9_]*\]?',
str2s,
flags=re.IGNORECASE
)
但它只返回:
'orange', 'juices', 'apple', 'apple['
如何获得-2]
?
您可以从 char a-zA-Z 开始匹配,然后匹配可选的单词字符,并可选地从左方括号匹配到右方括号。
\b[A-Z]\w*(?:\[[^][]*\])?
解释
\b
防止部分单词匹配的单词边界[AZ]\w*
匹配一个字符 a-zA-Z 后跟可选的单词字符(?:
非捕获组
\[[^][]*\]
使用否定字符类匹配[...]
)?
关闭非捕获组并使其可选import re
str2s = 'orange,juices,apple,apple[-2]'
print(re.findall(r'\b[A-Z]\w*(?:\[[^][]*\])?', str2s, flags=re.I))
输出
['orange', 'juices', 'apple', 'apple[-2]']
为了将字符串拆分为列表,我认为您必须知道确切的分隔符,或者能够识别这些分隔符,
即 it 或[,.]
或其他分隔符。
如果您不能从项目中定义分隔符,我认为通过常用方法很难实现您的目标。
话虽如此,对于orange,juices,apple,apple[-2]
,您可以使用r'([\w\[\]\-]+)'
https://regex101.com/r/ 2Xj7AR/1
以下代码将以您想要的方式提取单词:
import re
words = re.compile(r'\w+\[?-?\d*\]?', re.IGNORECASE)
s = 'orange,juices,apple,apple[-2],pineapple[20]'
words.findall(s)
这将导致以下结果:
['orange', 'juices', 'apple', 'apple[-2]', 'pineapple[20]']
请记住,上面的代码片段是使用您提供的示例字符串作为基础编写的。 如果您需要匹配其他类型的单词(例如007%abc
),则需要调整正则表达式以匹配更多字符。
SELECT RESULT, C1 ||','|| C2 ||','|| C3 || ','|| C4 AS R_W_APOSTROPHE
FROM (
SELECT RESULT,
REGEXP_REPLACE(REGEXP_SUBSTR(REGEXP_SUBSTR(RESULT,'[^,]+',1,1),'[^09+,].*'),'^|$','''') AS C1,
REGEXP_REPLACE(REGEXP_SUBSTR(REGEXP_SUBSTR(RESULT,'[^,]+',1,2),'[^09+,].*'),'^|$','''') AS C2,
REGEXP_REPLACE(REGEXP_SUBSTR(REGEXP_SUBSTR(RESULT,'[^,]+',1,3),'[^09+,].*'),'^|$','''') AS C3,
REGEXP_REPLACE(REGEXP_SUBSTR(REGEXP_SUBSTR(RESULT,'[^,]+',1,4),'[^09+,].*'),'^|$','''') AS C4
from (
select 'orange, juices, apple, apple[-2]' as RESULT from dual))
此代码是在 PL/SQL 上编写的,但您可以使用该算法。 也许可以让事情发生在你的脑海中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.