我正在尝试编写一个正则表达式来识别用户输入字符串中的空格,但引号("
... #load "my folder/my files/ program.prog" ;
)之间除外。例如,如果用户输入
#load "my folder/my files/ program.prog" ;
我希望我的正则表达式替换将其转换为
#include <iostream>
#include <string>
#include <regex>
int main(){
// Variables for user input
std::string input_line;
std::string program;
// User prompt
std::cout << ">>> ";
std::getline(std::cin, input_line);
// Remove leading/trailing whitespaces
input_line = std::regex_replace(input_line, std::regex("^ +| +$|( ) +"), "$1");
// Check result
std::cout << input_line << std::endl;
return 0;
}
到目前为止,我已实施以下内容(您可以运行here)。
import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
class LinkscrawlItem(scrapy.Item):
# define the fields for your item here like:
link = scrapy.Field()
attr = scrapy.Field()
class someSpider(CrawlSpider):
name = 'linkscrawl'
item = []
allowed_domains = ['mysite.com']
start_urls = ['//www.mysite.com/']
rules = (Rule (LinkExtractor(), callback="parse_obj", follow=True),
)
def parse_obj(self,response):
#print(response.status)
item = LinkscrawlItem()
item["link"] = str(response.url)+":"+str(response.status)
# item["link_res"] = response.status
# status = response.url
# item = response.url
# print(item)
filename = 'links.txt'
with open(filename, 'a') as f:
f.write('\n'+str(response.url)+":"+str(response.status)+'\n')
self.log('Saved file %s' % filename)
但这也删除了引号之间的空格。有什么方法可以使用正则表达式来忽略引号之间的空格吗?
答案 0 :(得分:1)
您可以添加另一个替代方法来匹配和捕获双引号字符串文字,并使用另一个反向引用将其重新插入到结果中:
input_line = std::regex_replace(
input_line,
std::regex(R"(^ +| +$|(\"[^\"\\]*(?:\\[\s\S][^\"\\]*)*\")|( ) +)"),
"$1$2");
请参阅C++ demo。
"[^"\\]*(?:\\[\s\S][^"\\]*)*\"
部分与"
匹配,然后匹配\
和"
以外的0 +字符,然后出现0次或更多次转义字符{{1}然后是任何与\
匹配的字符,然后是[\s\S]
和\
以外的0 +字符。
注意我使用原始字符串文字"
来避免必须转义正则表达式转义反斜杠(R"(...)"
= R"([\s\S])"
)。